From 1a3fafbeeebc7dc0753089a833fe8ba03f9e65b8 Mon Sep 17 00:00:00 2001 From: From-wh Date: Mon, 12 Jun 2023 18:37:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8A=E4=BC=A0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/admin/src/utils/videoCloud.js | 161 ++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 6 deletions(-) diff --git a/template/admin/src/utils/videoCloud.js b/template/admin/src/utils/videoCloud.js index a5416cfb2..5ea08f392 100644 --- a/template/admin/src/utils/videoCloud.js +++ b/template/admin/src/utils/videoCloud.js @@ -11,16 +11,53 @@ import * as qiniu from 'qiniu-js'; import Cos from 'cos-js-sdk-v5'; import axios from 'axios'; +import { upload } from '@/api/upload'; +const sign = (method, publicKey, privateKey, md5, contentType, date, bucketName, fileName) => { + const CryptoJS = require('crypto-js'); // 这里使用了crypto-js加密算法库,安装方法会在后面说明 + const CanonicalizedResource = `/${bucketName}/${fileName}`; + const StringToSign = method + '\n' + md5 + '\n' + contentType + '\n' + date + '\n' + CanonicalizedResource; // 此处的md5以及date是可选的,contentType对于PUT请求是可选的,对于POST请求则是必须的 + let Signature = CryptoJS.HmacSHA1(StringToSign, privateKey); + Signature = CryptoJS.enc.Base64.stringify(Signature); + return 'UCloud' + ' ' + publicKey + ':' + Signature; +}; export default { videoUpload(config) { - if (config.type === 'COS') { - return this.cosUpload(config.evfile, config.res.data, config.uploading); - } else if (config.type === 'OSS') { - return this.ossHttp(config.evfile, config.res, config.uploading); - } else { - return this.qiniuHttp(config.evfile, config.res, config.uploading); + let result; + switch (config.type) { + case 'COS': + result = this.cosUpload(config.evfile, config.res.data, config.uploading); + break; + case 'OSS': + result = this.ossHttp(config.evfile, config.res, config.uploading); + break; + case 'OBS': + result = this.obsHttp(config.evfile, config.res, config.uploading); + break; + case 'US3': + result = this.us3Http(config.evfile, config.res, config.uploading); + break; + case 'JDOSS': + result = this.uploadMp4ToLocal(config.evfile, config.res, config.uploading); + break; + case 'CTOSS': + result = this.obsHttp(config.evfile, config.res, config.uploading); + break; + case 'QINIU': + result = this.qiniuHttp(config.evfile, config.res, config.uploading); + break; + case 'local': + result = this.uploadMp4ToLocal(config.evfile, config.res, config.uploading); + break; } + return result; + // if (config.type === 'COS') { + // return this.cosUpload(config.evfile, config.res.data, config.uploading); + // } else if (config.type === 'OSS') { + // return this.ossHttp(config.evfile, config.res, config.uploading); + // } else { + // return this.qiniuHttp(config.evfile, config.res, config.uploading); + // } }, cosUpload(file, config, uploading) { let cos = new Cos({ @@ -184,4 +221,116 @@ export default { }); }); }, + obsHttp(file, res, videoIng) { + const fileObject = file.target.files[0]; + const Key = fileObject.name; + const pos = Key.lastIndexOf('.'); + let suffix = ''; + if (pos !== -1) { + suffix = Key.substring(pos); + } + const filename = new Date().getTime() + suffix; + const formData = new FormData(); + const data = res.data; + // 注意formData里append添加的键的大小写 + formData.append('key', filename); + formData.append('AccessKeyId', data.accessid); + formData.append('policy', data.policy); + formData.append('signature', data.signature); + formData.append('file', fileObject); + formData.append('success_action_status', 200); + const url = data.host; + const fileUrl = url + '/' + filename; + videoIng(true, 100); + return new Promise((resolve, reject) => { + axios.defaults.withCredentials = false; + axios + .post(url, formData) + .then(() => { + videoIng(false, 0); + resolve({ url: data.cdn ? data.cdn + '/' + filename : fileUrl }); + }) + .catch((res) => { + reject({ msg: res }); + }); + }); + }, + us3Http(file, res, videoIng) { + const fileObject = file.target.files[0]; + const Key = fileObject.name; + const pos = Key.lastIndexOf('.'); + let suffix = ''; + if (pos !== -1) { + suffix = Key.substring(pos); + } + const filename = new Date().getTime() + suffix; + const data = res.data; + + const auth = sign('PUT', data.accessid, data.secretKey, '', fileObject.type, '', data.storageName, filename); + return new Promise((resolve, reject) => { + axios.defaults.withCredentials = false; + const url = `https://${data.storageName}.cn-bj.ufileos.com/${filename}`; + axios + .put(url, fileObject, { + headers: { + Authorization: auth, + 'content-type': fileObject.type, + }, + }) + .then((res) => { + videoIng(false, 0); + resolve({ url: data.cdn ? data.cdn + '/' + filename : url }); + }) + .catch((res) => { + reject({ msg: res }); + }); + }); + }, + qiniuHttp(evfile, res, videoIng) { + const uptoken = res.data.token; + const file = evfile.target.files[0]; // Blob 对象,上传的文件 + const Key = file.name; // 上传后文件资源名以设置的 key 为主,如果 key 为 null 或者 undefined,则文件资源名会以 hash 值作为资源名。 + const pos = Key.lastIndexOf('.'); + let suffix = ''; + if (pos !== -1) { + suffix = Key.substring(pos); + } + const filename = new Date().getTime() + suffix; + const fileUrl = res.data.domain + '/' + filename; + const config = { + useCdnDomain: true, + }; + const putExtra = { + fname: '', // 文件原文件名 + params: {}, // 用来放置自定义变量 + mimeType: null, // 用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"] + }; + const observable = qiniu.upload(file, filename, uptoken, putExtra, config); + return new Promise((resolve, reject) => { + observable.subscribe({ + next: (result) => { + const progress = Math.round(result.total.loaded / result.total.size); + videoIng(true, progress); + // 主要用来展示进度 + }, + error: (errResult) => { + // 失败报错信息 + reject({ msg: errResult }); + }, + complete: (result) => { + // 接收成功后返回的信息 + videoIng(false, 0); + resolve({ url: res.data.cdn ? res.data.cdn + '/' + filename : fileUrl }); + }, + }); + }); + }, + // 本地上传 + uploadMp4ToLocal(evfile, res, videoIng) { + const fileObject = evfile.target.files[0]; // 获取的文件对象 + const formData = new FormData(); + formData.append('file', fileObject); + videoIng(true, 100); + return upload(formData); + }, };