前面我有介绍过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=>{
})












网友评论