无论将文件上传到阿里云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);