小程序直传阿里云点播

其实阿里云oss存储对象下的最佳实践中写的比较完整,但是在开发时仍然碰到了许多坑。

阿里云链接

流程

1.服务端使用sdk进行请求,获取上传凭证UploadAuth以及地址UploadAddress并返回给客户端
2.客户端得到上传凭证以及地址解析

代码案例 可直接食用

Crypto 和base64 下载 其实后端加密更加安全,也是官网推荐使用的

const Crypto = require('./cryptojs/cryptojs.js').Crypto;
const base64 = require('./cryptojs/base64.js').Base64;

upload(){
  //解析上传凭证和地址   这里写死,应该由后端返回
  let UploadAddress = "xxx" 
  let UploadAuth = "xxx"
  let UploadAddressObj =JSON.parse(base64.decode(UploadAddress))
  let UploadAuthObj = JSON.parse(base64.decode(UploadAuth))

  let aliOssParams =  that.aliOssParams({
      aid:UploadAuthObj.AccessKeyId,
      aky:UploadAuthObj.AccessKeySecret,
    });
    wx.uploadFile({
      url: aliOssParams.host,
      filePath: res.tempFilePath,
      name: 'file',
      header:{
        'Content-Type':'multipart/form-data'
      },
      formData: {
        name: res.tempFilePath,
        //目录,这里我使用了返回的文件名 官网写死使用`${filename}`,但是我传不上去
        key: UploadAddressObj.FileName,
        policy:aliOssParams.policy,//上传阿里云的加密策略
        OSSAccessKeyId: aliOssParams.aid,//自己阿里云的aid
        success_action_status: "200",
        signature: aliOssParams.signature,//上传阿里云的签名
        'x-oss-security-token':UploadAuthObj.SecurityToken
      },
      success: function (res) {
        console.log('上传成功',res);
      },
      fail:function(err){
        console.log('上传失败',err);
      },
      complete(){
        console.log('调用上传');
        
      }
    })
},
aliOssParams(opt){
    let aid = opt.aid ;//后台返回的阿里云的accessid  由UploadAuth解析而来
    let aky = opt.aky ;//后台返回阿里云的accesskeySecret  由UploadAuth解析而来
    let host = "https://xxx.oss-cn-shanghai.aliyuncs.com";//由UploadAddress解析拼接而来
    let policyText = {
            "expiration": "2022-01-01T12:00:00.000Z",//上传的文件失效日期自己定义
            "conditions": [
            ["content-length-range", 0, 1048576000]//上传的内容大小,自己定义
            ]
    };
    let policy = base64.encode(JSON.stringify(policyText));//生成的加密策略
    let bytes = Crypto.HMAC(Crypto.SHA1, policy, aky, { asBytes: true }) ;
    let signature = Crypto.util.bytesToBase64(bytes);//生成的签名
    return {
        policy: policy,
        signature:signature,
        aid:aid,
        host: host
    }
  },
第一次开发遇到的问题:

1.各个参数含义

key: UploadAddressObj.FileName,//指定目录
policy:aliOssParams.policy,//上传阿里云的加密策略
OSSAccessKeyId: aliOssParams.aid,// 由UploadAuth解析而来
success_action_status: "200",
signature: aliOssParams.signature,//上传阿里云的签名
'x-oss-security-token':UploadAuthObj.SecurityToken// 由UploadAuth解析而来

2.阿里云需要策略权限需要开通oss上传权限
3.报错提示不明确

1. key参数不对竟然会报policy不对.....
2.必须由服务端sdk发送预请求,否则回报ossId不存在
忘了...

你可能感兴趣的:(小程序直传阿里云点播)