zgldh / qiniu-laravel-storage

Qiniu 云储存 Laravel 5 Storage版
MIT License
521 stars 79 forks source link

增加上传自动触发持久化方法 #36

Closed callect closed 7 years ago

callect commented 7 years ago

上传文件异步自动触发持久化,参考官方JDK: https://github.com/qiniu/php-sdk/blob/master/examples/upload_and_pfop.php 解决使用put上传完同步persistentFop使得私有通道设置无效的情况

zgldh commented 7 years ago

我觉得这个问题的本质是, 七牛 put 文件时, 本代码库应当允许传递自定义的 upload token 进去。 而目前的 put 方法并不支持。 因为 Flysystemput 函数并没有 upload token 的概念。

您提交的方法 putWithPfop 一定程度上解决了您遇到的问题,但我认为其解决的问题过于特例,而且超出了一个文件存取库应有的职责范围。

我建议为七牛的这种 upload token 机制设置一个特殊的函数 withUploadToken($uploadToken) 使得可以这样用:

$disk = \Storage::disk('qiniu');

$wmImg = Qiniu\base64_urlSafeEncode('http://Bucket_Name.qiniudn.com/logo-s.png');
$pfop = "avthumb/m3u8/wmImage/$wmImg";
$policy = array(
  'persistentOps' => $pfop,
  'persistentNotifyUrl' => $notifyUrl,
  'persistentPipeline' => $pipeline
);
$uploadToken = $disk->getDriver()->uploadToken($path, $expires, $policy);

$disk->getDriver()->withUploadToken($uploadToken)->put($fileName, $fileContent);

withUploadToken只对下一次 put 函数有效。 建议你向这个方向进行修改。

zgldh commented 7 years ago

有更优雅的解决方式了:

$disk = \Storage::disk('qiniu');

$wmImg = Qiniu\base64_urlSafeEncode('http://Bucket_Name.qiniudn.com/logo-s.png'); $pfop = "avthumb/m3u8/wmImage/$wmImg"; $policy = array( 'persistentOps' => $pfop, 'persistentNotifyUrl' => $notifyUrl, 'persistentPipeline' => $pipeline ); $uploadToken = $disk->getDriver()->uploadToken($path, $expires, $policy);

$disk->put($fileName, $fileContent, ['token'=>$uploadToken]);

你可以试试 master 分支最新代码。 看看效果。

callect commented 7 years ago

好的,我当时也看到put方法后的config参数了,一时没找到用法,这个回我去试下

callect commented 7 years ago

我本地测试的时候会报错 ErrorException in vendor/illuminate/filesystem/FilesystemAdapter.php line 329: Array to string conversion 你那里没报吗

zgldh commented 7 years ago

这个目前还有问题。。和 Laravel 的Filesystem用法有冲突。 put 第三个函数 Laravel 定义为 visibility, 不是config。

zgldh commented 7 years ago

看来只能写一个 Plugin 解决问题了。 我建议写一个 WithUploadToken($token) , 使得下一次的put函数使用该token进行上传。

zgldh commented 7 years ago

在 master 分支添加了 withUploadToken plugin, 试试看吧

callect commented 7 years ago

恩,好,看了代码,感觉可以

callect commented 7 years ago

试过最新的代码,昨天那个put($file,$content,$config);的代码未恢复,导致还是会报Array to string conversion的错误 另外,$disk->uploadToken()要怎么用?为什么我这里报500错,但没任何错误提示

zgldh commented 7 years ago

已去掉 put 第三个参数


        $disk = Storage::disk('qiniu');

        $pipeline = 'pipeline_name';
        $notifyUrl = 'http://notify.fake.com';
        $wmImg = \Qiniu\base64_urlSafeDecode('http://site.qiniudn.com/testpop2.png');
        $pfop = "avthumb/m3u8/wmImage/$wmImg";
        $policy = array(
            'persistentOps'       => $pfop,
            'persistentNotifyUrl' => $notifyUrl,
            'persistentPipeline'  => $pipeline
        );

        $token = $disk->getDriver()->uploadToken('testpop.png', 3600, $policy);
callect commented 7 years ago

还有一个错误,WithUploadToken插件的getMethod方法return 的是‘uploadToken'应该是'withUploadToken' 这是我刚才500白页面的原因 改完这处后,我实测成功了 还有个小需求: 上传成功后,返回的是true,能不能像我提交的方法一样,返回一组变量,里面有persistent_id这个结果 我需要用这个结果去查看持久化的状态,因为有可能会持续比较长的时间,需要让用户端知道数据还在处理,谢谢

zgldh commented 7 years ago

增加了新的plugin: lastReturn 用于各种写入操作后,获得服务器的返回值。

callect commented 7 years ago

还有两个错:adapter中withUploadToken方法应为public lastReturn插件getMethod方法return 'getLastReturn'

zgldh commented 7 years ago

withUploadToken 已更新为 public lastReturn getMethod 的值可以任意定义。不必和某函数名一致。


        $disk = Storage::disk('qiniu');
        $disk->put('testpop.png', file_get_contents(resource_path('assets/images/default_logo.png')));
        $return = $disk->getDriver()->lastReturn();

$return 就能得到最后的返回信息