小程序直传文件到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的具体流程为:

  1. 创建一个 UTF-8 编码的 policy。
  2. 将 policy 进行 base64 编码,其值即为 policy 表单域填入的值,将该值作为将要签名的字符串。
  3. 使用 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)

 }

 })
}

 

posted @ 2021-03-02 20:28  似是故人来~  阅读(1353)  评论(0编辑  收藏  举报