UNPKG

@efox/upload-file

Version:

支持所有类型的文件上传到腾讯云,上传完成上报文件MD5、类型、URL、项目名称、用户uid

125 lines (116 loc) 3.61 kB
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 }) } }