overtrue/flysystem-qiniu

总感觉有一个 bug。

JellyBool opened this issue · 10 comments

看了源码,感觉

https://github.com/overtrue/flysystem-qiniu/blob/master/src/QiniuAdapter.php#L59

这行的 put 方法有一个 bug。这个也可能是 七牛 的 php-sdk 引起的:

https://github.com/qiniu/php-sdk/blob/master/src/Qiniu/Storage/FormUploader.php#L14

对比了一下,感觉在 QiniuAdapter.php 中使用 put 是将第二个参数作为 path,而七牛的 php-sdk 是希望传入 name 的。这个时候非常奇怪,如果使用 overtrue/flysystem-qiniu 直接这样:

比如这个是在 https://github.com/overtrue/laravel-ueditor/blob/master/src/QiNiuStorage.php#L33 使用的时候

 public function store(UploadedFile $file, $filename)
    {
        Storage::disk('qiniu')->put($filename, $file);
    }

 public function getUrl($filename)
    {
        return 'http://' . config('filesystems.disks.qiniu.domain') . $filename;
    }

好像无论如何 七牛会自动 加上一个文件名, 比如:

2017-03-18_14-04-11

2017-03-18_14-04-51

七牛都把前面的文件名作为路径处理了,再自己加文件 /4dKRM0FN76R9c7SMjPkHnaYZbIWU5qI7V8UPdufK.jpeg

骑牛有一个图片处理流程。你什么都不设置的时候 应该是文件名和路径是不变化的。

@JellyBool https://github.com/qiniu/php-sdk/blob/master/src/Qiniu/Storage/FormUploader.php#L14

@param $key 上传文件名

$key 就是文件名啊,对于我们的项目来讲就是 path 啊。

public function store(UploadedFile $file, $filename)
{
    Storage::disk('qiniu')->put($filename, $file);
}

这样用肯定是错误的,因为 $file 并不是一个 string 的文件名,所以他们会给你生成文件名

@JellyBool

Flysystem API 里实际并没有提供按文件路径上传的做法,只有按内容存。

FormUploader::put() 是使用二进制流存储,而 FormUploader::putFile() 才是按路径上传,所以你的代码应该改成:

public function store(UploadedFile $file, $filename)
{
    Storage::disk('qiniu')->writeStream($filename, fopen($file->getRealPath(), 'r'));
}

@overtrue OK,我 fix 一下

@JellyBool 不过我可以考虑加一个 API:

public function store(UploadedFile $file, $filename)
{
    Storage::disk('qiniu')->putFile($filename, $file);
}

@JellyBool 不过好像也没啥必要哈

@overtrue ,我等下就把 editor 的代码提一波。

七牛这个 putFile() 也挺好,我可以录视频了,哈哈哈。

不加了,你直接按上面的代码来吧,感觉破坏了原子性