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)
        },
      })
    })
  });
}
相关推荐
说私域3 小时前
日本零售精髓赋能下 链动2+1模式驱动新零售本质回归与发展格局研究
人工智能·小程序·数据挖掘·回归·流量运营·零售·私域运营
奔跑的web.3 小时前
UniApp 路由导航守
前端·javascript·uni-app
特立独行的猫a4 小时前
主要跨端开发框架对比:Flutter、RN、KMP、Uniapp、Cordova,谁是未来主流?
flutter·uni-app·uniapp·rn·kmp·kuikly
说私域5 小时前
流量裂变与数字重塑:基于AI智能名片小程序的短视频全域引流范式研究
人工智能·小程序·流量运营·私域运营
万物得其道者成15 小时前
UniApp 多端滑块验证码插件 zxj-slide-verify 实用指南
uni-app
蓝帆傲亦17 小时前
支付宝小程序性能暴增秘籍:UniApp项目极限优化全攻略
小程序·uni-app
CHU7290351 天前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序
2501_933907211 天前
深圳本凡科技专业企业APP开发,助力手机应用创新优化
科技·微信小程序·小程序
每天都要加油呀!1 天前
TypeError: uni.requestPayment is not a function
小程序
java1234_小锋1 天前
分享一套优质的微信小程序校园志愿者系统(SpringBoot后端+Vue3管理端)
微信小程序·小程序·校园志愿者