通过百度上传组件WebUploader的批量上传文件到阿里云OSS和又拍云

无论将文件上传到阿里云OSS还是又拍云,都需要提交特定的表单值,阿里云OSS和又拍云都是通过这些特定的值来验证上传者的身份。这两者都包括了policy和signature,都通过各自的算法来得到。

动态获取policy和signature值

百度WebUploader上传组件可以通过formData来将除了文件以外的一些表单值post到指定的地址。那么就可以将policy和signature等参数值发送到阿里云OSS和又拍云实现文件上传。

但是问题来了,阿里云OSS和又拍云的policy和signature都是有有效期的,一旦过了有效期,就无法上传。特别是在批量上传文件时,可能会很耗时间。当然可以通过延长有效期来达到目的。但是更科学的办法时,每次上次时都重新计算得到policy和signature值。

WebUploader的uploadBeforeSend事件可以允许在上传前修改formData的数据,可以参考下面这篇文章:

http://www.huangji.me/webuploader-formdata/

设置回调地址,异步处理文件上传后的结果

阿里云OSS和又拍云都可以在文件上传成功后,通过POST的方式将上传结果发送到我们指定的回调地址,所以这个回调地址一定要是外网可以访问的地址,外网获取到阿里云OSS和又拍云POST过来的结果信息,来处理后面的逻辑,例如更新数据库等操作。

阿里云是通过post发送callback参数,其值是通过base64加密的,eg:(更多关于阿里云callback:https://help.aliyun.com/document_detail/31927.html?spm=5176.doc31926.6.178.lDqIaJ)

$callback_param = array(
    'callbackUrl'=>'http://你的回调地址',
    'callbackBody'=>'ext-param=oss&filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
    'callbackBodyType'=>"application/x-www-form-urlencoded"
);
$callback_string = json_encode($callback_param);
$base64_callback_body = base64_encode($callback_string);

阿里云OSS指定的回调地址还需要返回处理的结果,否则会报错误,例如可以返回:

 header("Content-Type: application/json");
 $data = array("Status"=>"Ok");
 echo json_encode($data);

又拍云是在计算policy前,就将回调地址作为计算policy的参数设置的,eg: (更多关于又拍云callback:http://docs.upyun.com/api/form_api/#_2

     
        $options['save-key'] = '/{year}{mon}/{filename}'.'{.suffix}';
        $options['bucket'] = '你的bucket名';
        $form_api_secret =  '你的form_api_secret’;
        $options['expiration'] = time()+10;     //10秒就过期
        $options['notify-url'] ='http://你的回调地址'; // 异步回调 url
        $options['ext-param'] = 'upyun'; // 额外参数
        $policy = base64_encode(json_encode($options));
        $signature = md5($policy.'&'.$form_api_secret);

发表评论

邮箱地址不会被公开。 必填项已用*标注