Taro 实现 阿里云 OSS

1,245 阅读1分钟

使用Taro-react开发小程序时,需要实现阿里云oss,发现ali-oss无法使用

经历9981难,终于搞定。以下是封装代码

import base64 from '@utils/base64';
import '@plugins/cryptojs/cryptojs';

const getPolicyBase64 = (timeout) => {
  let date = new Date();
  date.setHours(date.getHours() + timeout);
  let srcT = date.toISOString();
  const policyText = {
    expiration: srcT, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
    conditions: [
      ['content-length-range', 0, 5 * 1024 * 1024] // 设置上传文件的大小限制,5mb
    ]
  };

  const policyBase64 = base64.encode(JSON.stringify(policyText));
  return policyBase64;
};

const getSignature = (keySecret, policyBase64) => {
  const Crypto: any = window.Crypto;
  const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, keySecret, {
    asBytes: true
  });
  const signature = Crypto.util.bytesToBase64(bytes);
  return signature;
};

// 文件上传
export const upFileApi = (fileName, ossRes, file) => {
  //文件名
  const policyBase64 = getPolicyBase64(3000);
  const signature = getSignature(ossRes.data.secret, policyBase64); //获取签名
  return new Promise((resole) => {
    Taro.uploadFile({
      url: `https://${ossRes.data.bucket}.xxxxxxxxx/`,
      filePath: file,
      name: 'file',
      formData: {
        key: fileName,
        policy: policyBase64,
        OSSAccessKeyId: ossRes.data.key,
        signature: signature,
        success_action_status: '200',
        'x-oss-security-token': ossRes.data.stsToken
      },
      success: (res) => {
        resole(`https://${ossRes.data.bucket}.xxxxxxxxx/${fileName}`);
      }
    });
  });
};

以上代码用到了两个库base64和Crypto 这两个库分别都做了更改,需要获取的请关注公众号 BWeb 或者扫下面二维码, 回复“taro阿里云OSS”

qrcode_for_gh_608fa23a438c_344.jpg