美文网首页
微信小程序直传文件到oss

微信小程序直传文件到oss

作者: 耍帅oldboy | 来源:发表于2022-08-18 01:08 被阅读0次

前面我有介绍过vue前端直传文件到oss,同样来写一下小程序直传到oss
在小程序的开发目录utils/oss.js,新建一个oss.js复制如下代码

const Base64 = require("./base64")
const Crypto = require("./crypto-js")
import api from "./api"

const randomString = (len) => {
  len = len || 32;
  const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  let maxPos = chars.length;
  let pwd = '';
  for (let i = 0; i < len; i++) {
    pwd += chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}

//生产随机的文件名
const getFileName = (fileName) => {
  let timestamp = Date.parse(new Date())/1000
  return randomString(32)+timestamp+'.'+fileName.split('.').slice(-1)
}

const getToken = () =>{
  return new Promise((resolve, reject) => {
      api.ossGetToken({}).then(res=>{
        resolve(res.data.Credentials)
      }).catch(err=>{
        reject(err)
      })
  })
}

const ossUpload = (tempFilePath) => {
  return new Promise(async (resolve, reject) => {
//从后端接口获取返回的值,可以参考之前写的vue上传php的代码部分
    let sts = await getToken()

    let policyText = {
      "expiration": sts.Expiration, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
      "conditions": [
        ["content-length-range", 0, 1048576000] // 设置上传文件的大小限制
      ]
    }

    let policyBase64 = Base64.encode(JSON.stringify(policyText))
    let bytes = Crypto.HmacSHA1( policyBase64, sts.AccessKeySecret, { asBytes: true }) ;
    let signature = Crypto.enc.Base64.stringify(bytes)
    let key = getFileName(tempFilePath)

    wx.uploadFile({
      url:sts.host,
      header:{
        "Content-Type":"multipart/form-data",
      },
      filePath:tempFilePath,
      name:'file',
      formData:{
        key:key,
        policy:policyBase64,
        OSSAccessKeyId:sts.AccessKeyId,
        signature:signature,
        'success_action_status':'200',
        'x-oss-security-token':sts.SecurityToken
      },
      success(res){
        if(res.statusCode==200){
            resolve({url:sts.host+'/'+key})
        }else{
          reject(res)
        }
      },
      fail(err){
        wx.showToast({title:'上传文件失败'})
        console.log(err)
        reject(err)
      }

    })
  })
}

module.exports = {
  ossUpload
}

调用方式

import oss from '/utils/oss.js'
oss.ossUpload(tempFilePath).then(res=>{

}).catch(err=>{

})

相关文章

网友评论

      本文标题:微信小程序直传文件到oss

      本文链接:https://www.haomeiwen.com/subject/bkosgrtx.html