|
|
- /**
- * 阿里云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;
|