| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- // +----------------------------------------------------------------------
- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
- // +----------------------------------------------------------------------
- // | Author: CRMEB Team <admin@crmeb.com>
- // +----------------------------------------------------------------------
- import * as qiniu from 'qiniu-js';
- import Cos from 'cos-js-sdk-v5';
- import axios from 'axios';
- 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);
- }
- },
- cosUpload(file, config, uploading) {
- let cos = new Cos({
- getAuthorization(options, callback) {
- callback({
- TmpSecretId: config.credentials.tmpSecretId, // 临时密钥的 tmpSecretId
- TmpSecretKey: config.credentials.tmpSecretKey, // 临时密钥的 tmpSecretKey
- XCosSecurityToken: config.credentials.sessionToken, // 临时密钥的 sessionToken
- ExpiredTime: config.expiredTime, // 临时密钥失效时间戳,是申请临时密钥时,时间戳加 durationSeconds
- });
- },
- });
- let fileObject = file.target.files[0];
- let Key = fileObject.name;
- let pos = Key.lastIndexOf('.');
- let suffix = '';
- if (pos !== -1) {
- suffix = Key.substring(pos);
- }
- let filename = new Date().getTime() + suffix;
- return new Promise((resolve, reject) => {
- cos.sliceUploadFile(
- {
- Bucket: config.bucket /* 必须 */,
- Region: config.region /* 必须 */,
- Key: filename /* 必须 */,
- Body: fileObject, // 上传文件对象
- onProgress: function (progressData) {
- uploading(progressData);
- },
- },
- function (err, data) {
- if (err) {
- reject({ msg: err });
- } else {
- resolve({ url: 'http://' + data.Location, ETag: data.ETag });
- }
- },
- );
- });
- },
- cosHttp(evfile, res, videoIng) {
- // 腾讯云
- // 对更多字符编码的 url encode 格式
- let camSafeUrlEncode = function (str) {
- return encodeURIComponent(str)
- .replace(/!/g, '%21')
- .replace(/'/g, '%27')
- .replace(/\(/g, '%28')
- .replace(/\)/g, '%29')
- .replace(/\*/g, '%2A');
- };
- let fileObject = evfile.target.files[0];
- let Key = fileObject.name;
- let pos = Key.lastIndexOf('.');
- let suffix = '';
- if (pos !== -1) {
- suffix = Key.substring(pos);
- }
- let filename = new Date().getTime() + suffix;
- let data = res.data;
- let XCosSecurityToken = data.credentials.sessionToken;
- let url = data.url + camSafeUrlEncode(filename).replace(/%2F/g, '/');
- let xhr = new XMLHttpRequest();
- xhr.open('PUT', url, true);
- XCosSecurityToken && xhr.setRequestHeader('x-cos-security-token', XCosSecurityToken);
- xhr.upload.onprogress = function (e) {
- let progress = Math.round((e.loaded / e.total) * 10000) / 100;
- videoIng(true, progress);
- };
- return new Promise((resolve, reject) => {
- xhr.onload = function () {
- if (/^2\d\d$/.test('' + xhr.status)) {
- var ETag = xhr.getResponseHeader('etag');
- videoIng(false, 0);
- resolve({ url: url, ETag: ETag });
- } else {
- reject({ msg: '文件 ' + filename + ' 上传失败,状态码:' + xhr.statu });
- }
- };
- xhr.onerror = function () {
- reject({ msg: '文件 ' + filename + '上传失败,请检查是否没配置 CORS 跨域规' });
- };
- xhr.send(fileObject);
- xhr.onreadystatechange = function () {};
- });
- },
- ossHttp(evfile, res, videoIng) {
- let that = this;
- let fileObject = evfile.target.files[0];
- let file = fileObject.name;
- let pos = file.lastIndexOf('.');
- let suffix = '';
- if (pos !== -1) {
- suffix = file.substring(pos);
- }
- let filename = new Date().getTime() + suffix;
- let formData = new FormData();
- let data = res.data;
- // 注意formData里append添加的键的大小写
- formData.append('key', filename); // 存储在oss的文件路径
- formData.append('OSSAccessKeyId', data.accessid); // accessKeyId
- formData.append('policy', data.policy); // policy
- formData.append('Signature', data.signature); // 签名
- // 如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
- formData.append('file', fileObject);
- formData.append('success_action_status', 200); // 成功后返回的操作码
- let url = data.host;
- let fileUrl = url + '/' + filename;
- videoIng(true, 100);
- return new Promise((resolve, reject) => {
- axios.defaults.withCredentials = false;
- axios
- .post(url, formData)
- .then(() => {
- // that.progress = 0;
- videoIng(false, 0);
- resolve({ url: fileUrl });
- })
- .catch((res) => {
- reject({ msg: res });
- });
- });
- },
- qiniuHttp(evfile, res, videoIng) {
- let uptoken = res.data.token;
- let file = evfile.target.files[0]; // Blob 对象,上传的文件
- let Key = file.name; // 上传后文件资源名以设置的 key 为主,如果 key 为 null 或者 undefined,则文件资源名会以 hash 值作为资源名。
- let pos = Key.lastIndexOf('.');
- let suffix = '';
- if (pos !== -1) {
- suffix = Key.substring(pos);
- }
- let filename = new Date().getTime() + suffix;
- let fileUrl = res.data.domain + '/' + filename;
- let config = {
- useCdnDomain: true,
- };
- let putExtra = {
- fname: '', // 文件原文件名
- params: {}, // 用来放置自定义变量
- mimeType: null, // 用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
- };
- let observable = qiniu.upload(file, filename, uptoken, putExtra, config);
- return new Promise((resolve, reject) => {
- observable.subscribe({
- next: (result) => {
- let progress = Math.round(result.total.loaded / result.total.size);
- videoIng(true, progress);
- // 主要用来展示进度
- },
- error: (errResult) => {
- // 失败报错信息
- reject({ msg: errResult });
- },
- complete: (result) => {
- // 接收成功后返回的信息
- videoIng(false, 0);
- resolve({ url: fileUrl });
- },
- });
- });
- },
- };
|