75 lines
2.9 KiB
TypeScript
75 lines
2.9 KiB
TypeScript
import Crypto from 'crypto-js'
|
|
import {Base64} from 'js-base64'
|
|
import {i18n} from "@/locale";
|
|
|
|
const env = {
|
|
uploadImageUrl: 'https://wendy123.oss-ap-southeast-1.aliyuncs.com/', // 默认存在根目录,可根据需求改
|
|
accessKeySecret: 'TSZOD1jULKPFsNp2zKhAopLe3c3AiH', // accessKeySecret 去你的阿里云上控制台上找
|
|
ossAccessKeyId: 'LTAI5tQq1bSBFCfsbvwX6DqQ', // AccessKeyId 去你的阿里云上控制台上找
|
|
timeout: 87600, // 这个是上传文件时Policy的失效时间
|
|
}
|
|
|
|
const getPolicyBase64 = function (): string {
|
|
const date = new Date()
|
|
date.setHours(date.getHours() + env.timeout)
|
|
const expirationTime = date.toISOString()
|
|
const policyText = {
|
|
expiration: expirationTime, // 设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
|
|
conditions: [
|
|
['content-length-range', 0, 2000 * 1024 * 1024], // 设置上传文件的大小限制,2G
|
|
],
|
|
}
|
|
|
|
return Base64.encode(JSON.stringify(policyText))
|
|
}
|
|
|
|
const getSignature = function (policyBase64: string): string {
|
|
const bytes = Crypto.HmacSHA1(policyBase64, env.accessKeySecret)
|
|
return Crypto.enc.Base64.stringify(bytes)
|
|
}
|
|
|
|
// 上传图片到阿里云oss
|
|
const upload = function (filePath: string, suffix = '.png', dir = 'app/image/') {
|
|
return new Promise((resolve, reject) => {
|
|
if (!filePath) {
|
|
return uni.showToast({icon: "none", title: i18n.global.t('common.prompt.picture-wrong-please-try-again')})
|
|
}
|
|
|
|
// 图片名字 可以自行定义,这里是采用当前的时间戳 + 150内的随机数来给图片命名的
|
|
const fileKey = dir + new Date().getTime() + Math.floor(Math.random() * 150) + suffix
|
|
|
|
const aliyunServerURL = env.uploadImageUrl // OSS地址,需要https
|
|
const policyBase64 = getPolicyBase64()
|
|
const signature = getSignature(policyBase64) // 获取签名
|
|
|
|
uni.uploadFile({
|
|
url: aliyunServerURL, // 开发者服务器 url
|
|
filePath: filePath, // 要上传文件资源的路径
|
|
name: 'file', // 必须填file
|
|
formData: {
|
|
key: fileKey,
|
|
policy: policyBase64,
|
|
OSSAccessKeyId: env.ossAccessKeyId,
|
|
signature: signature,
|
|
success_action_status: '200',
|
|
},
|
|
success: function (res) {
|
|
console.log(res)
|
|
if (res.statusCode !== 200) {
|
|
reject(new Error('upload error:' + JSON.stringify(res)))
|
|
return
|
|
}
|
|
resolve(aliyunServerURL + fileKey)
|
|
},
|
|
fail: function (err) {
|
|
console.log(err)
|
|
uni.hideLoading()
|
|
uni.showToast({icon: "none", title: i18n.global.t('common.prompt.up-failed')})
|
|
reject(err)
|
|
},
|
|
})
|
|
})
|
|
}
|
|
|
|
export {upload}
|