@efox/upload-file
Version:
支持所有类型的文件上传到腾讯云,上传完成上报文件MD5、类型、URL、项目名称、用户uid
125 lines (116 loc) • 3.61 kB
JavaScript
import COS from 'cos-js-sdk-v5'
import { toast } from '../toast'
import { getUploadToken, genMultipartUploadToken } from './get-token'
import config from './config'
/**
* 生成文件路径
* @param projectName {string}
* @param fileName {string}
* @param fileSuffix {string}
* @returns {string}
*/
export function generateFilePath (projectName, fileName, fileSuffix) {
return `${config.rootName}/${projectName}/${fileName + (fileSuffix && '.' + fileSuffix)}`
}
// 腾讯云 Bucket
export const Bucket = 'dianhu-1253537286'
// 腾讯云 Region
export const Region = 'eu-moscow'
// 获取签名成回调
const cos = new COS({
async getAuthorization (options, callback) {
const { Key, Method } = options
const result = await genMultipartUploadToken(`/${Key}`, Method)
callback({ // eslint-disable-line
Authorization: result.data
})
},
ProgressInterval: 200
})
/** 腾讯云 put object */
const cosPutObject = ({ Bucket, Region, fileName, blob, progress, serverOrigin }) => {
return new Promise((resolve, reject) => {
cos.putObject({
Bucket,
Region,
Key: fileName,
Body: blob,
onProgress: function (progressData) {
if (typeof progress === 'function') {
progress(progressData)
}
}
}, (err, data) => {
if (err) {
toast('上传文件失败')
const errMsg = 'cosPutObject package server fail.'
reject(new Error(errMsg + fileName))
} else {
resolve({
url: serverOrigin + fileName,
originUrl: `https://${data.Location}`,
cloudData: data,
fileName
})
}
})
})
}
/** 腾讯云 List Multipart Uploads */
const multipartListUploads = ({ Bucket, Region, fileName, blob, progress, serverOrigin }) => {
return new Promise((resolve, reject) => {
cos.sliceUploadFile({
Bucket, /* 必须 */
Region, /* 必须 */
Key: fileName, /* 必须 */
Body: blob, /* 必须 */
// TaskReady: function (taskId) { /* 非必须 */
// console.log('文件上传 TaskReady', taskId)
// },
// onHashProgress: function (progressData) { /* 非必须 */
// console.log('文件上传 onHashProgress', JSON.stringify(progressData))
// },
onProgress: function (progressData) { /* 非必须 */
if (typeof progress === 'function') {
progress(progressData)
}
}
}, function (err, data) {
if (err) {
toast('上传文件失败')
const errMsg = 'multipartListUploads package server fail.'
reject(new Error(errMsg + fileName))
} else {
resolve({
url: serverOrigin + fileName,
originUrl: `https://${data.Location}`,
cloudData: data,
fileName
})
}
})
})
}
/**
* 上传文件
* @param blob {Blob} 上传文件
* @param fileName {string} 文件名称
* @param progress {Function} 上传进度
* @param serverOrigin {string} 访问地址域名
* @return {Promise<*>}
*/
export default async function ({ blob, fileName, progress, serverOrigin }) {
// 验证用户权限
const result = await getUploadToken(fileName)
if (result.code !== 0) {
throw result
}
// 大于10MB使用分片上传
if (blob.size > 1024 * 1024 * 10) {
/** 使用分片上传 */
return multipartListUploads({ Bucket, Region, fileName, blob, progress, serverOrigin })
} else {
/** 使用普通上传 */
return cosPutObject({ Bucket, Region, fileName, blob, progress, serverOrigin })
}
}