小程序直传文件到oss
与JavaScript客户端直传的原理相同,小程序上传文件到 OSS 也是利用 OSS 提供的 PostObject 接口来实现表单文件上传到 OSS:https://help.aliyun.com/document_detail/31988.html?spm=a2c4g.11186623.2.13.6dfd58abh4C6Ld
测试环境:微信小程序环境下将文件上传到 OSS
1、配置bucket跨域
进入oss管理控制台--->选择要上传的bucket--->基础设置--->跨域设置---->添加规则
2、配置该bucket的外网域名到小程序的上传域名中白名单中
3、上传请求
计算Signature的具体流程为:
- 创建一个 UTF-8 编码的 policy。
- 将 policy 进行 base64 编码,其值即为 policy 表单域填入的值,将该值作为将要签名的字符串。
- 使用 AccessKeySecret 对要签名的字符串进行签名,签名方法与Header中签名的计算方法相同(将要签名的字符串替换为 policy 即可)
安装:crypto-js
cnpm install crypto-js
安装:js-base64
cnpm install --save js-base64 cnpm install --save babel-preset-env const CryptoJS = require('crypto-js'); import { Base64 } from 'js-base64'; const accessid= 'xxxxxxxxxxx'; const accesskey= 'xxxxxxxtjSonMETLI0KLy'; const SecurityToken="xxxxxxxxxx" const host = 'https://xxxx-cad-oss.oss-cn-shenzhen.aliyuncs.com'; //bucket的外网域名 const policyText = { "expiration": "2030-01-01T12:00:00.000Z", //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 "conditions": [ ["content-length-range", 0, 1048576000] // 设置上传文件的大小限制 ] }; function getOssSecret (accesskey) { const policyBase64= Base64.encode(JSON.stringify(policyText)) const message = policyBase64 const bytes = CryptoJS.HmacSHA1(message, accesskey, { asBytes: true }) ; const signature = CryptoJS.enc.Base64.stringify(bytes); return {"policyBase64":policyBase64,"signature":signature} } function upload (){ const{policyBase64, signature}=getOssSecret(accesskey) wx.uploadFile({ url: host,//bucket的外网域名 url filePath: src,//要上传文件资源的路径 name: 'file',//必须填file formData: { 'name':"file", 'key':"images/test.jpg", //object_key 'policy': policyBase64, 'OSSAccessKeyId':accessid, 'success_action_status': '200', 'signature':signature, 'x-oss-security-token':SecurityToken //该字段必填,阿里云的示例上没有写 }, success: function(res) { console.log("success",res) if (res.statusCode != 200) { } }, fail:function (errMsg) { console.log("fail",errMsg) } }) }