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 小时前
高校宿舍信息管理系统小程序
小程序·宿舍管理小程序
说私域3 小时前
基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究
人工智能·小程序·零售
断墨先生5 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
guai_guai_guai7 小时前
uniapp
前端·javascript·vue.js·uni-app
阿伟来咯~12 小时前
一些 uniapp相关bug
uni-app·bug
丁总学Java15 小时前
微信小程序,点击bindtap事件后,没有跳转到详情页,有可能是app.json中没有正确配置页面路径
微信小程序·小程序·json
瑶琴AI前端16 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
说私域16 小时前
基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析
人工智能·小程序
mosen86816 小时前
Uniapp去除顶部导航栏-小程序、H5、APP适用
vue.js·微信小程序·小程序·uni-app·uniapp
qq229511650217 小时前
微信小程序的汽车维修预约管理系统
微信小程序·小程序·汽车