GithubHelp home page GithubHelp logo

laravel-ueditor's Introduction

Laravel-UEditor

UEditor integration for Laravel 5.

使用

视频教程:https://www.laravist.com/series/awesome-laravel-packages/episodes/7

安装

$ composer require "overtrue/laravel-ueditor:~1.0"

配置

  1. 添加下面一行到 config/app.phpproviders 部分:

    Overtrue\LaravelUEditor\UEditorServiceProvider::class,
  2. 发布配置文件与资源

    $ php artisan vendor:publish --provider='Overtrue\LaravelUEditor\UEditorServiceProvider'
  3. 模板引入编辑器

    这行的作用是引入编辑器需要的 css,js 等文件,所以你不需要再手动去引入它们。

    @include('vendor.ueditor.assets')
  4. 编辑器的初始化

    <!-- 实例化编辑器 -->
    <script type="text/javascript">
        var ue = UE.getEditor('container');
        ue.ready(function() {
            ue.execCommand('serverparam', '_token', '{{ csrf_token() }}'); // 设置 CSRF token.
        });
    </script>
    
    <!-- 编辑器容器 -->
    <script id="container" name="content" type="text/plain"></script>

说明

  1. 5.4+ 请不要忘记 php artisan storage:link
  2. 如果你使用的是 laravel 5.3 以下版本,请先创建软链接:
    # 请在项目根目录执行以下命令
    $ ln -s `pwd`/storage/app/public `pwd`/public/storage
  3. config/ueditor.php 配置 disk'public' 情况下,上传路径在:public/uploads/ 下,确认该目录存在并可写。
  4. 如果要修改上传路径,请在 config/ueditor.php 里各种类型的上传路径,但是都在 public 下。
  5. 请在 .env 中正确配置 APP_URL 为你的当前域名,否则可能上传成功了,但是无法正确显示。

七牛支持

如果你想使用七牛云储存,需要进行下面几个简单的操作:

1.安装和配置 laravel-filesystem-qiniu

2.配置 config/ueditor.phpdiskqiniu:

'disk' => 'qiniu'

3.剩下时间打局 LOL,已经完事了。

七牛的 access_keysecret_key 可以在这里找到:https://portal.qiniu.com/user/key ,在创建 bucket (空间)的时候,推荐大家都使用公开的空间。

事件

你肯定有一些朋友肯定会有一些比较特殊的场景,那么你可以使用本插件提供的事件来支持:

请按照 Laravel 事件的文档来使用: https://laravel.com/docs/5.4/events#registering-events-and-listeners

上传中事件

Overtrue\LaravelUEditor\Events\Uploading

在保存文件之前,你可以拿到一些信息:

  • $event->file 这是请求的已经上传的文件对象,Symfony\Component\HttpFoundation\File\UploadedFile 实例。
  • $event->filename 这是即将存储时用的新文件名
  • $event->config 上传配置,数组。

你可以在本事件监听器返回值,返回值将替换 $filename 作为存储文件名。

上传完成事件

Overtrue\LaravelUEditor\Events\Uploaded

它有两个属性:

  • $event->file 与 Uploading 一样,上传的文件

  • $event->result 上传结构,数组,包含以下信息:

    'state' => 'SUCCESS',
    'url' => 'http://xxxxxx.qiniucdn.com/xxx/xxx.jpg',
    'title' => '文件名.jpg',
    'original' => '上传时的源文件名.jpg',
    'type' => 'jpg',
    'size' => 17283,

你可以监听此事件用于一些后续处理任务,比如记录到数据库。

License

MIT

laravel-ueditor's People

Contributors

codingyu avatar jellybool avatar linhaijian99 avatar mingyoung avatar overtrue avatar realzark avatar venus-robot avatar yueziii avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

laravel-ueditor's Issues

1.2.1 异常:Call to undefined method League\Flysystem\Filesystem::url

laravel 5.1.*
本地文件上传成功,但页面显示报错

[2017-05-22 11:06:48] local.ERROR: BadMethodCallException: Call to undefined method League\Flysystem\Filesystem::url in /vendor/league/flysystem/src/Plugin/PluggableTrait.php:90
Stack trace:
#0 [internal function]: League\Flysystem\Filesystem->__call('url', Array)
#1 /vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php(350): call_user_func_array(Array, Array)
#2 /vendor/overtrue/laravel-ueditor/src/StorageManager.php(64): Illuminate\Filesystem\FilesystemAdapter->__call('url', Array)
#3 /vendor/overtrue/laravel-ueditor/src/UEditorController.php(43): Overtrue\LaravelUEditor\StorageManager->upload(Object(Illuminate\Http\Request))
#4 [internal function]: Overtrue\LaravelUEditor\UEditorController->serve(Object(Illuminate\Http\Request))
#5 /vendor/laravel/framework/src/Illuminate/Routing/Controller.php(256): call_user_func_array(Array, Array)
#6 /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(164): Illuminate\Routing\Controller->callAction('serve', Array)
#7 /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(112): Illuminate\Routing\ControllerDispatcher->call(Object(Overtrue\LaravelUEditor\UEditorController), Object(Illuminate\Routing\Route), 'serve')
#8 [internal function]: Illuminate\Routing\ControllerDispatcher->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#9 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(139): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#10 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#12 /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(114): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#13 /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(67): Illuminate\Routing\ControllerDispatcher->callWithinStack(Object(Overtrue\LaravelUEditor\UEditorController), Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'serve')
#14 /vendor/laravel/framework/src/Illuminate/Routing/Route.php(203): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Overtrue\\Larave...', 'serve')
#15 /vendor/laravel/framework/src/Illuminate/Routing/Route.php(134): Illuminate\Routing\Route->runWithCustomDispatcher(Object(Illuminate\Http\Request))
#16 /vendor/laravel/framework/src/Illuminate/Routing/Router.php(708): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#17 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#18 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(139): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#19 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#20 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#21 /vendor/laravel/framework/src/Illuminate/Routing/Router.php(710): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#22 /vendor/laravel/framework/src/Illuminate/Routing/Router.php(673): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#23 /vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#24 /vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(236): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#25 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#26 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(139): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#27 /vendor/barryvdh/laravel-debugbar/src/Middleware/Debugbar.php(51): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#28 [internal function]: Barryvdh\Debugbar\Middleware\Debugbar->handle(Object(Illuminate\Http\Request), Object(Closure))
#29 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#30 /vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#31 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#32 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#33 /vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#35 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#36 /vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#37 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#38 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#39 /vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#40 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#41 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#42 /vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#43 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#44 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#45 /vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(44): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#46 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#47 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#48 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#49 /vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#50 /vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#51 /vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#52 /public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#53 /server.php(21): require_once('/...')
#54 {main}  

异常:Call to undefined method League\Flysystem\Filesystem::putFileAs

"overtrue/laravel-ueditor": "~1.0",
ueditor.php:
'disk' => 'public',

上传图片时出现:
[2017-05-20 16:52:06] local.ERROR: BadMethodCallException: Call to undefined method League\Flysystem\Filesystem::putFileAs in H:\wamp\www\gdyxh\vendor\league\flysystem\src\Plugin\PluggableTrait.php:90
Stack trace:
#0 [internal function]: League\Flysystem\Filesystem->__call('putFileAs', Array)
#1 H:\wamp\www\gdyxh\vendor\laravel\framework\src\Illuminate\Filesystem\FilesystemAdapter.php(350): call_user_func_array(Array, Array)
#2 H:\wamp\www\gdyxh\vendor\overtrue\laravel-ueditor\src\StorageManager.php(125): Illuminate\Filesystem\FilesystemAdapter->__call('putFileAs', Array)
#3 H:\wamp\www\gdyxh\vendor\overtrue\laravel-ueditor\src\StorageManager.php(60): Overtrue\LaravelUEditor\StorageManager->store(Object(Symfony\Component\HttpFoundation\File\UploadedFile), '/uploads/image/...')
#4 H:\wamp\www\gdyxh\vendor\overtrue\laravel-ueditor\src\UEditorController.php(43): Overtrue\LaravelUEditor\StorageManager->upload(Object(Illuminate\Http\Request))
#5 [internal function]: Overtrue\LaravelUEditor\UEditorController->serve(Object(Illuminate\Http\Request))
#6 H:\wamp\www\gdyxh\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(256): call_user_func_array(Array, Array)
#7 H:\wamp\www\gdyxh\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(164): Illuminate\Routing\Controller->callAction('serve', Array)
#8 H:\wamp\www\gdyxh\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(112): Illuminate\Routing\ControllerDispatcher->call(Object(Overtrue\LaravelUEditor\UEditorController), Object(Illuminate\Routing\Route), 'serve')

配置qiniu后返回的数据里url有2个斜杠

{"state":"SUCCESS","url":"http://ow3prqlyx.bkt.clouddn.com//uploads/image/2017/09/11/87a7a8f6d3fb0151f93f6f8b9e582cec.gif","title":"/uploads/image/2017/09/11/87a7a8f6d3fb0151f93f6f8b9e582cec.gif","original":"vip.gif","type":"","size":151}

Uncaught SyntaxError: Unexpected identifier

配置,上传都是ok,就是在最后一步显示有问题。看碰到过这种情况没?跟编译环境有关吗?
单步调试情况,第24472行报的错:Uncaught SyntaxError: Unexpected identifier
at new Function ()

如果七牛包是
"qiniu/php-sdk": "^7.1",
这样加入到composer.json文件中,将会出这样的现象:“上传错误”,“本地保存成功”。
必须把7.1前面的"^"去掉就可以正常上传和显示,也就是目前超兄的ueditor七牛插件包只支持7.1版本的。
7.2版本的在24471行的result返回的值前面有“ query from “字样(这个是7.2�中 vendor/qiniu/php-sdk/src/Qiniu/Config.php的getZone() 在返回结果时自动加上的),正是这个导致ueditor前端无法正常解析和显示图片。

望超兄有空时更新下。

跨域问题!!

在域名为admin.dev.xxx.com中引用这个轮子,
跨域方案是用了laravel-cors轮子。

发起图片上传请求的时候检测不到request中的Origin导致跨域轮子不允许上传。
image

laravel-admin后台扩展编辑器。单图上传失败,多图可以

服务端返回是成功的json,但浏览器一直报警告说期望文档类型却返回个json。
image

image
image
image
猜测是js解析返回结果的时候,没把他当做json来解析,然后找到ueditor.all.js 24468行,修改result解析结果为JSON.parse(result)
image
问题解决,但是TMD还是报期望文档却返回个json
image
多图上传不会出现这个警告,并且上传正常,总感觉是这个ue.all.js的锅

上传文件的问题

图片没有保存到public,而是保存到了stroage/app里面。。还望解答。谢谢。

发布文件时的写法错误

php artisan vendor:publish --provider='Overtrue\LaravelUEditor\UEditorServiceProvider'
不应该用引号包围起来
php artisan vendor:publish --provider=Overtrue\LaravelUEditor\UEditorServiceProvider

windows下laravel5.4,上传图片,图片无法显示

  • 查看了下,图片保存到了storage\app\public\uploads\....里面
  • 但图片显示的地址是根目录的public\uploads\.....里面
  • 所以导致无法显示图片,这个....弄了半天,没搞定....配置是按说明文档上来的,我是本地开发...

上传视频是出现http请求错误

我使用的是七牛云,配置了自己的bucket 上传照片虽然不能在UEditor中预览,但是可以成功上传到七牛云,但是上传视频会出现http请求错误 请问这个可能是哪里操作。

Ps:php.ini文件的upload_max_filesize 修改过了

没加入中间件控制上传

1.上传没加入中间件控制

2.php7报错
ErrorException in StorageManager.php line 217:
rand() expects parameter 2 to be integer, float given

使用 artisan route:cache 时,会出现404异常(在控制台中可以看到)

ueditor.all.js:8228 XHR finished loading: GET "http://xxxx.app/ueditor/server?action=config&&noCache=1498757616410".
doAjax @ ueditor.all.js:8228
request @ ueditor.all.js:8372
(anonymous) @ ueditor.all.js:8069
ueditor.all.js:8092 请求后台配置项http错误,上传功能将不能正常使用!
showErrorMsg @ ueditor.all.js:8092
onerror @ ueditor.all.js:8083
xhr.onreadystatechange @ ueditor.all.js:8220
ueditor.all.js:8228 GET http://xxxx.app/ueditor/server?action=config&&noCache=1498757616408 404 (Not Found)
doAjax @ ueditor.all.js:8228
request @ ueditor.all.js:8372
(anonymous) @ ueditor.all.js:8069
ueditor.all.js:8228 XHR finished loading: GET "http://xxx.app/ueditor/server?action=config&&noCache=1498757616408".
doAjax @ ueditor.all.js:8228
request @ ueditor.all.js:8372
(anonymous) @ ueditor.all.js:8069
ueditor.all.js:8092 请求后台配置项http错误,上传功能将不能正常使用!

图片上传失败

image

为什么图片上传地址请求失败呢,明明有路由也访问不了

image

无法显示

我按照readme配置,显示不出来?什么情况呢

图片保存到/storage/app/public/uploads下

我的配置如下
APP_URL=http://www.tina.com

`'disk' => 'public',

`

然后我编辑器页面图片是破的 所以自己写了一个路由

Route::get('/storage/uploads/image/{yy}/{mm}/{dd}/{file}',function($yy,$mm,$dd,$file){ $image = "/Library/WebServer/Documents/stu2/storage/app/public/uploads/image/"."{$yy}/"."{$mm}/"."{$dd}"."/{$file}"; header("Content-Type:image/jpeg"); echo file_get_contents($image); });

现在可以显示了,但是非要这样写吗 为什么图片不到public下呢

还有我为什么只能找到一些前台文件 处理图片上传的php代码 在什么目录呢

谢谢!!!

Laravel5.2使用监听事件Overtrue\LaravelUEditor\Events\Uploaded失败

我在EventListener注册了监听Overtrue\LaravelUEditor\Events\Uploaded事件的处理,在上传图片成功后,$this->eventSupport()返回的结果为false,然后查看寻找Illuminate\Foundation\Events\Dispatchable,没有此文件,应该是laravel5.4之后引入的吧!请问要监听上传成功事件后做处理,该怎么做?

laravel5.5.3版本执行publish命令

在5.5.3版本中直接执行php artisan vendor:publish --provider='Overtrue\LaravelUEditor\UEditorServiceProvider' 将不会得到任何结果,我执行了php artisan vendor:publish再选择下标才能生成配置文件。

文件名解析问题

问题文件:StorageManager.php
image
对于微信公众号文章内的图片链接是这样的:

https://mmbiz.qpic.cn/mmbiz_jpg/vBKJ934geNIQSl9xz5OwpsoKy7gCCr8kYZSKDcM6mUNG0rUbUyDqeVYgMCyvkRYKq5sLusPL9uj9iaJ38XeGoKQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

如果使用 $img->getFilename() 这种方式获取图片名称的话,复制微信公众号文章的时候,所有图片获取到的图片名称永远都是这样的:

640

就会导致永远都只会上传一张图片,后面的图片都不会上传,由于名称一样,所有图片的地址也都替换成最初上传的那张图片链接。为什么不直接对传到后台的图片链接进行 md5 操作?

有说的不对的地方请指正,谢谢!

无法使用laravel-admin的中间件

'route' => [
'name' => '/ueditor/server',
'options' => [
'middleware' => 'admin',
],
],
已经配置成上面的这个admin中间件了,但是在laravel-admin里面还是无法上传图片。如果把这段注释掉就能上传了,但是那样不安全了。

关于图片可以放在storage而不是public?

超哥你好,我想问下现在这个插件在上传图片的时候可以把图片上传在storage而不是public下?因为当前项目public为了安全问题不可以添加写权限。能通过 php artisan storage:link解决?另外资源能直接从public下取得吗?万分感激!

View [vendor.ueditor.assets] not found

2

laravel版本: 5.4.23
不知道为什么说这个模版不存在。。

在 laravel\framework\src\Illuminate\View\FileViewFinder.php line 137: 报了两个异常 :

  1. ErrorException
  2. InvalidArgumentException

错误都是这个:
View [vendor.ueditor.assets] not found

PS:我在5.3的时候还是能够使用的。。

图片无法上传

laravel5.3,将Filesystem.php中的路径改为public_path()后可以上传,但上传完图片后,ueditor请求的路径为 /storage//uploads/image/2017/05/25/3fe5450976edc225f8b690c1d5d683f3.jpeg

安装包问题

image
下载下来的包内容居然跟 github 上的内容不一样。
已知文件 StorageManager.php 里,我下载的根本没有 fetch 方法,其他还未比对,我现在只能在这下载然后覆盖原来下载的包了。

<?php

/*
 * This file is part of the overtrue/laravel-ueditor.
 *
 * (c) overtrue <[email protected]>
 *
 * This source file is subject to the MIT license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Overtrue\LaravelUEditor;

use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Overtrue\LaravelUEditor\Events\Uploaded;
use Overtrue\LaravelUEditor\Events\Uploading;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Class StorageManager.
 */
class StorageManager
{
    use UrlResolverTrait;

    /**
     * @var \Illuminate\Contracts\Filesystem\Filesystem
     */
    protected $disk;

    /**
     * Constructor.
     *
     * @param \Illuminate\Contracts\Filesystem\Filesystem $disk
     */
    public function __construct(Filesystem $disk)
    {
        $this->disk = $disk;
    }

    /**
     * Upload a file.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function upload(Request $request)
    {
        $config = $this->getUploadConfig($request->get('action'));

        if (!$request->hasFile($config['field_name'])) {
            return $this->error('UPLOAD_ERR_NO_FILE');
        }

        $file = $request->file($config['field_name']);

        if ($error = $this->fileHasError($file, $config)) {
            return $this->error($error);
        }

        $filename = $this->getFilename($file, $config);

        if ($this->eventSupport()) {
            $modifiedFilename = event(new Uploading($file, $filename, $config), [], true);
            $filename = !is_null($modifiedFilename) ? $modifiedFilename : $filename;
        }

        $this->store($file, $filename);

        $response = [
            'state' => 'SUCCESS',
            'url' => $this->getUrl($filename),
            'title' => $filename,
            'original' => $file->getClientOriginalName(),
            'type' => $file->getExtension(),
            'size' => $file->getSize(),
        ];

        if ($this->eventSupport()) {
            event(new Uploaded($file, $response));
        }

        return response()->json($response);
    }

    /**
     * @return bool
     */
    public function eventSupport()
    {
        return trait_exists('Illuminate\Foundation\Events\Dispatchable');
    }

    /**
     * List all files of dir.
     *
     * @param string $path
     * @param int    $start
     * @param int    $size
     * @param array  $allowFiles
     *
     * @return Response
     */
    public function listFiles($path, $start, $size = 20, array $allowFiles = [])
    {
        $allFiles = $this->disk->listContents($path, true);
        $files = $this->paginateFiles($allFiles, $start, $size);

        return [
            'state' => empty($files) ? 'EMPTY' : 'SUCCESS',
            'list' => $files,
            'start' => $start,
            'total' => count($allFiles),
        ];
    }

    /**
     * Split results.
     *
     * @param array $files
     * @param int   $start
     * @param int   $size
     *
     * @return array
     */
    protected function paginateFiles(array $files, $start = 0, $size = 50)
    {
        return collect($files)->where('type', 'file')->splice($start)->take($size)->map(function ($file) {
            return [
                'url' => $this->getUrl($file['path']),
                'mtime' => $file['timestamp'],
            ];
        })->all();
    }

    /**
     * Store file.
     *
     * @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
     * @param string                                              $filename
     *
     * @return mixed
     */
    protected function store(UploadedFile $file, $filename)
    {
        return $this->disk->put($filename, fopen($file->getRealPath(), 'r+'));
    }

    /**
     * Validate the input file.
     *
     * @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
     * @param array                                               $config
     *
     * @return bool|string
     */
    protected function fileHasError(UploadedFile $file, array $config)
    {
        $error = false;

        if (!$file->isValid()) {
            $error = $file->getError();
        } elseif ($file->getSize() > $config['max_size']) {
            $error = 'upload.ERROR_SIZE_EXCEED';
        } elseif (!empty($config['allow_files']) &&
            !in_array('.'.$file->getClientOriginalExtension(), $config['allow_files'])) {
            $error = 'upload.ERROR_TYPE_NOT_ALLOWED';
        }

        return $error;
    }

    /**
     * Get the new filename of file.
     *
     * @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
     * @param array                                               $config
     *
     * @return string
     */
    protected function getFilename(UploadedFile $file, array $config)
    {
        $ext = '.'.$file->getClientOriginalExtension();

        $filename = config('ueditor.hash_filename') ? md5($file->getFilename()).$ext : $file->getClientOriginalName();

        return $this->formatPath($config['path_format'], $filename);
    }

    /**
     * Get configuration of current action.
     *
     * @param string $action
     *
     * @return array
     */
    protected function getUploadConfig($action)
    {
        $upload = config('ueditor.upload');

        $prefixes = [
            'image', 'scrawl', 'snapscreen', 'catcher', 'video', 'file',
            'imageManager', 'fileManager',
        ];

        $config = [];

        foreach ($prefixes as $prefix) {
            if ($action == $upload[$prefix.'ActionName']) {
                $config = [
                    'action' => array_get($upload, $prefix.'ActionName'),
                    'field_name' => array_get($upload, $prefix.'FieldName'),
                    'max_size' => array_get($upload, $prefix.'MaxSize'),
                    'allow_files' => array_get($upload, $prefix.'AllowFiles', []),
                    'path_format' => array_get($upload, $prefix.'PathFormat'),
                ];

                break;
            }
        }

        return $config;
    }

    /**
     * Make error response.
     *
     * @param $message
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function error($message)
    {
        return response()->json(['state' => trans("ueditor::upload.{$message}")]);
    }

    /**
     * Format the storage path.
     *
     * @param string $path
     * @param string $filename
     *
     * @return mixed
     */
    protected function formatPath($path, $filename)
    {
        $replacement = array_merge(explode('-', date('Y-y-m-d-H-i-s')), [$filename, time()]);
        $placeholders = ['{yyyy}', '{yy}', '{mm}', '{dd}', '{hh}', '{ii}', '{ss}', '{filename}', '{time}'];
        $path = str_replace($placeholders, $replacement, $path);

        //替换随机字符串
        if (preg_match('/\{rand\:([\d]*)\}/i', $path, $matches)) {
            $length = min($matches[1], strlen(PHP_INT_MAX));
            $path = preg_replace('/\{rand\:[\d]*\}/i', str_pad(mt_rand(0, pow(10, $length) - 1), $length, '0', STR_PAD_LEFT), $path);
        }

        if (!str_contains($path, $filename)) {
            $path = str_finish($path, '/').$filename;
        }

        return $path;
    }
}

catch-image 返回 ueditor::upload.UPLOAD_ERR_NO_FILE

环境laravel5.5+ubuntu+nginx+php7.2.5

已经按照按照配置进行操作。

  • 已经执行 php artisan storage:link
  • config/ueditor.php 配置为 public
  • public/uploads/ 权限为 0777
  • .envAPP_URL 为当前访问连接

以下调试信息:

# Overtrue\LaravelUEditor\StorageManager.php@upload 输出 config 和 $request->all()

## config
Array
(
    [action] => catch-image
    [field_name] => source
    [max_size] => 2048000
    [allow_files] => Array
        (
            [0] => .png
            [1] => .jpg
            [2] => .jpeg
            [3] => .gif
            [4] => .bmp
        )

    [path_format] => /upload/image/{yyyy}/{mm}/{dd}/
)

##  $request->all()
Array
(
    [source] => Array
        (
            [0] => https://lccdn.phphub.org/uploads/avatars/7926_1481821627.png?imageView2/1/w/100/h/100
            [1] => https://lccdn.phphub.org/uploads/avatars/21479_1516766508.jpg?imageView2/1/w/100/h/100
            [2] => https://lccdn.phphub.org/uploads/avatars/16439_1495175693.jpeg?imageView2/1/w/100/h/100
        )

    [action] => catch-image
    [_token] => kgCrUuyct3qNBRXXUPppgAuvK6ntETvgpI8PuVtg
)
## $request->hasFile($config['field_name'])  输出 false
##  $request->file($config['field_name']) 输出为空

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.