/** * 阿里云OSS工具类 */ import OSSConfig from "@/utils/oss-upload/oss/OSSConfig.js" //支持web端 import { uploadFileToOSS } from '@/utils/oss-upload/oss/web.js' import ossConfig from '@/config.js' /** * 生成一个随机的Key */ function storeKey() { let s = []; let hexDigits = "0123456789abcdef"; for (let i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); s[8] = s[13] = s[18] = s[23] = "-"; return s.join(""); } /** * 根据当天日期在OSS端生成文件夹 */ function storeFolder() { const date = new Date(); const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n } return [date.getFullYear(), date.getMonth() + 1, date.getDate()].map(formatNumber).join('-') } /** * 阿里云OSS上传文件, 所有具体功能的工具函数均基于此 * 注意, resolve时一定为上传成功, 返回OSS上的Key * @param filePath 待上传文件的URI * @param key 存储桶中的目标文件名 * @param folder 存储桶中的目标文件夹 */ export function ossUpload(filePath, key = storeKey(), folder = storeFolder()) { return new Promise((resolve, reject) => { if (folder && folder?.length > 0) { if (folder[0] == "/") folder = folder.slice(1, folder.length) if (folder[folder.length - 1] != "/") folder += "/" key = folder + key } const filePrefixArr = filePath.split(".") key += `.${filePrefixArr[filePrefixArr.length - 1]}` let config = { url: OSSConfig.host, name: 'file', filePath, formData: { key, policy: OSSConfig.policyBase64, OSSAccessKeyId: OSSConfig.accessid, success_action_status: '200', signature: OSSConfig.signature, }, success(res) { if (res.errMsg.includes("uploadFile:ok")) { resolve(ossConfig.aliOss.url + key) } else { reject(res) } }, fail(err) { reject(err) } } uni.uploadFile(config) }) } /** * 阿里云OSS上传图片 * @param {compressed, key, folder, success, fail} compressed: 是否压缩 key: 存储桶中的目标文件名 folder: 存储桶中的目标文件夹 */ export function ossUploadImage({ key, folder, compressed = true, //是否压缩 success, //成功时的回调 fail //失败时的回调 }) { const sizeType = [compressed ? 'compressed' : 'original'] uni.chooseImage({ count: 1, sizeType, success(res) { // #ifdef H5 return uploadFileToOSS(res.tempFiles[0]).then(success).catch(fail) // #endif ossUpload(res.tempFilePaths[0], key, folder).then(success).catch(fail) }, fail }) } /** * 阿里云OSS上传视频 * @param { key, folder, sourceType, compressed, maxDuration, camera, success, fail} * key: 存储桶中的目标文件名 folder: 存储桶中的目标文件夹 其它参数同uni.chooseVideo(mpWeixin) */ export function ossUploadVideo({ key, folder, sourceType = ['album', 'camera'], //album 从相册选视频, camera 使用相机拍摄 compressed = true, //是否压缩所选的视频源文件 maxDuration = 60, //拍摄视频最长拍摄时间, 单位秒。最长支持 60 秒 camera = 'back', //调用相机方向, 'front'、'back', 默认'back' success, //成功时的回调 fail //失败时的回调 }) { uni.chooseVideo({ sourceType, compressed, maxDuration, camera, success(res) { // #ifdef H5 return uploadFileToOSS(res.tempFile).then(success).catch(fail) // #endif ossUpload(res.tempFilePath, key, folder).then(success).catch(fail) }, fail }) } const OSS = { ossUploadVideo, ossUploadImage, ossUpload } export default OSS;