uniapp小程序上传oss

uniapp上传小程序代码

javascript 复制代码
import crypto from 'crypto-js';
import { Base64 } from 'js-base64/base64.js';
// 计算oss签名。
function computeSignature(accessKeySecret, canonicalString) {
  return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));
}
const getPolicyBase64 = function () {
  let date = new Date();
  date.setHours(date.getHours() + '87600');
  let expiration = date.toISOString();
  const policyText = {
    "expiration": expiration, //设置该Policy的失效时间
    "conditions": [
      ["content-length-range", 0, 1024 * 1024 * 1024 * 5] // 设置上传文件的大小限制, 5G
    ]
  };
  const policyBase64 = Base64.encode(JSON.stringify(policyText));
  return policyBase64;
}

/**
 * 获取oss签名
 */
export const getOssAuthorization = (callback) => {
  request({
    url: `xxxxx`,
    method: 'get',
  }).then((res) => {
  	// 返回参数
	// {
    //   accessKeyId: "",
    //   accessKeySecret: "",
    //   bucket: '',
    //   bucketName: "", 桶名
    //   callback: null,
    //   dir: "",
    //   endpoint: "https://oss-cn-xxxx.aliyuncs.com",
    //   keyName: "",
    //   osBasicInfo: "",
    //   path: '',
    //   region: "",
    //   response: '',
    //   securityToken: ''
    // }
    callback && callback(res.data)
  })
};
/**
 * 
 * @param {string} filePath 文件的路径
 * @param {string} fileSize 文件的大小
 * @param {string} fileSuffix 文件后后缀
 * @param {string} fileName 文件夹名
 * @param {*} param
 * @returns 
 */
export const ossUploadFile = (filePath, fileSize, fileSuffix = '', fileName) => {
  return new Promise((resolve, reject) => {
    if (!filePath) {
      uni.showModal({ title: '文件错误', content: '请重试', showCancel: false });
      uni.hideLoading();
      return false;
    }
    getOssAuthorization(async(data) => {
      // 这里指定上传的文件名
      const aliyunFileKey = `${data.dir}${fileName}`;
      // 拼接上传的oss地址
      let str = 'https://'
      const aliyunServerURL = data.endpoint.replace(str, `${str}${data.bucketName}.`);
      // 密钥
      const accessKeyId = data.accessKeyId;
      // 超时的时间
      const policyBase64 = getPolicyBase64();
      // 临时证书
      const signature = computeSignature(data.accessKeySecret, policyBase64);
      uni.uploadFile({
        url: aliyunServerURL, // 上传的域名
        filePath: filePath, // 上传的文件
        name: "file",
        formData: {
          key: aliyunFileKey, // 文件名称
          policy: policyBase64, // 过期时间
          OSSAccessKeyId: accessKeyId, // 秘钥
          signature: signature, // 临时证书
          success_action_status: "200",
          "x-oss-security-token": data.securityToken
        },
        success: (res) => {
          console.log("成功回调", res)
          if (res.statusCode == 200) {
            let result = aliyunServerURL + "/" + aliyunFileKey
            console.log(result, '====文件地址');
            resolve(result)
          } else {
            reject(res)
          }
        },
        fail: (err) => {
          console.log(err, 'err==上传失败');
          err.wxaddinfo = aliyunServerURL
          reject(err)
        },
      })
    })
  });
}
相关推荐
徐飞不会喝酒2 小时前
uniapp 微信小程序uview2.0 u-popup弹出层弹出在遮罩层不影响卡片正常勾选的情况下实现点击空白区域关闭弹层
微信小程序·uni-app
说私域6 小时前
优质内容在个人IP运营中的重要性:以开源AI智能名片商城小程序为应用实例的深度探讨
人工智能·tcp/ip·小程序
小王码农记7 小时前
微信小程序中使用weui组件库
微信小程序·小程序
gongzemin9 小时前
uni-app 微信小程序发送订阅消息
前端·微信小程序·uni-app
顽疲11 小时前
从零用java实现 小红书 springboot vue uniapp (9)消息推送功能
java·vue.js·spring boot·uni-app
yuehua_zhang11 小时前
uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥
前端·javascript·uni-app
weixin_4721835411 小时前
uniapp使用sm4加密
前端·javascript·uni-app
林涧泣11 小时前
【Uniapp-Vue3】watch和watchEffect监听的使用
前端·vue.js·uni-app
顽疲13 小时前
从零用java实现 小红书 springboot vue uniapp (8)个人资料修改 消息页优化
java·vue.js·spring boot·uni-app
大大。13 小时前
微信小程序防止重复点击事件
微信小程序·小程序