Closed callect closed 7 years ago
我觉得这个问题的本质是, 七牛 put
文件时, 本代码库应当允许传递自定义的 upload token 进去。
而目前的 put
方法并不支持。 因为 Flysystem
的 put
函数并没有 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
函数有效。
建议你向这个方向进行修改。
有更优雅的解决方式了:
$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 分支最新代码。 看看效果。
好的,我当时也看到put方法后的config参数了,一时没找到用法,这个回我去试下
我本地测试的时候会报错 ErrorException in vendor/illuminate/filesystem/FilesystemAdapter.php line 329: Array to string conversion 你那里没报吗
这个目前还有问题。。和 Laravel 的Filesystem用法有冲突。 put 第三个函数 Laravel 定义为 visibility, 不是config。
看来只能写一个 Plugin 解决问题了。 我建议写一个 WithUploadToken($token) , 使得下一次的put函数使用该token进行上传。
在 master 分支添加了 withUploadToken plugin, 试试看吧
恩,好,看了代码,感觉可以
试过最新的代码,昨天那个put($file,$content,$config);的代码未恢复,导致还是会报Array to string conversion的错误 另外,$disk->uploadToken()要怎么用?为什么我这里报500错,但没任何错误提示
已去掉 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);
还有一个错误,WithUploadToken插件的getMethod方法return 的是‘uploadToken'应该是'withUploadToken' 这是我刚才500白页面的原因 改完这处后,我实测成功了 还有个小需求: 上传成功后,返回的是true,能不能像我提交的方法一样,返回一组变量,里面有persistent_id这个结果 我需要用这个结果去查看持久化的状态,因为有可能会持续比较长的时间,需要让用户端知道数据还在处理,谢谢
增加了新的plugin: lastReturn
用于各种写入操作后,获得服务器的返回值。
还有两个错:adapter中withUploadToken方法应为public lastReturn插件getMethod方法return 'getLastReturn'
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 就能得到最后的返回信息
上传文件异步自动触发持久化,参考官方JDK: https://github.com/qiniu/php-sdk/blob/master/examples/upload_and_pfop.php 解决使用put上传完同步persistentFop使得私有通道设置无效的情况