举个🌰,用钉钉小程序将一段视频在 前端 直接传到阿里云上。
由于 js-base64 这个npm包在钉钉小程序使用不了,而目前钉钉小程序又没有base64ToArrayBuffer这类方法,故只能曲线救国,使用 dd.writeFile和 dd.readFile来做base64的转换。
首先,我们得先处理OSS配置,具体如下:
js
import crypto from "crypto-js"
const OSSConfig = {
AccessKeyId: "xxxx",
AccessKeySecret: "xxxxxx",
Host: "xxxxx", // 具体某个账号下,
SecurityToken: "xx", // 可选,使用STS签名时必传。
}
// 计算签名。
const computeSignature = (accessKeySecret, canonicalString) => {
return crypto.enc.Base64.stringify(
crypto.HmacSHA1(canonicalString, accessKeySecret)
)
}
let ossData = null
const getOssConfig = () => {
const date = new Date()
date.setHours(date.getHours() + 24) //加 1个小时
const policyText = {
expiration: date.toISOString(), // 设置policy过期时间。
conditions: [
// 限制上传大小。
["content-length-range", 0, 1024 * 1024 * 1024],
],
}
let fileManager = dd.getFileSystemManager()
fileManager.writeFile({
filePath: `${dd.env.USER_DATA_PATH}/test.txt`,
data: JSON.stringify(policyText),
success: () => {
fileManager.readFile({
filePath: `${dd.env.USER_DATA_PATH}/test.txt`,
encoding: "base64",
success: (res) => {
console.log(res.data, "readFile")
const signature = computeSignature(
OSSConfig.AccessKeySecret,
res.data
)
ossData = {
OSSAccessKeyId: OSSConfig.AccessKeyId,
signature,
policy: res.data,
// "x-oss-security-token": OSSConfig.SecurityToken,
}
},
fail: (err) => {
console.log(err)
},
})
},
fail: (err) => {
console.log(err)
},
})
}
这个ossData就是我们处理好后的配置项,接下来将其填充到 dd.uploadFile 里就大功告成了!
js
dd.chooseVideo({
sourceType: ["album", "camera"],
maxDuration: 60,
success: (res) => {
let uniqueId = `${dirPath}xcx-${new Date().getTime()}.mp4` // dirPath为存储的文件夹路径, 比如"dev/front-end/video/"
uni.showLoading({
title: "视频上传中...",
})
dd.uploadFile({
url: OSSConfig.Host,
fileType: "video",
fileName: "file",
formData: {
...ossData, // 上述getOssConfig方法得到的结果
key: uniqueId, // 该值为你存在在oss上的位置 后面上传成功之后拼接得到链接需要使用
success_action_status: "200", // 默认上传成功状态码为204,此处被success_action_status设置为200。
},
filePath: res.tempFilePath,
success: (res) => {
uni.hideLoading()
console.log("视频上传成功,地址为:",`${OSSConfig.Host}/${uniqueId}`)
},
fail: (err) => {
uni.hideLoading()
},
})
},
fail: (err) => {
console.log(err)
},
})
欢迎小伙伴留言讨论,互相学习!
❤❤❤ 如果对你有帮助,记得点赞收藏哦!❤❤❤