videoCloud.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // +----------------------------------------------------------------------
  2. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  3. // +----------------------------------------------------------------------
  4. // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
  5. // +----------------------------------------------------------------------
  6. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  7. // +----------------------------------------------------------------------
  8. // | Author: CRMEB Team <admin@crmeb.com>
  9. // +----------------------------------------------------------------------
  10. import * as qiniu from 'qiniu-js';
  11. import Cos from 'cos-js-sdk-v5';
  12. import axios from 'axios';
  13. export default {
  14. videoUpload(config) {
  15. if (config.type === 'COS') {
  16. return this.cosUpload(config.evfile, config.res.data, config.uploading);
  17. } else if (config.type === 'OSS') {
  18. return this.ossHttp(config.evfile, config.res, config.uploading);
  19. } else {
  20. return this.qiniuHttp(config.evfile, config.res, config.uploading);
  21. }
  22. },
  23. cosUpload(file, config, uploading) {
  24. let cos = new Cos({
  25. getAuthorization(options, callback) {
  26. callback({
  27. TmpSecretId: config.credentials.tmpSecretId, // 临时密钥的 tmpSecretId
  28. TmpSecretKey: config.credentials.tmpSecretKey, // 临时密钥的 tmpSecretKey
  29. XCosSecurityToken: config.credentials.sessionToken, // 临时密钥的 sessionToken
  30. ExpiredTime: config.expiredTime, // 临时密钥失效时间戳,是申请临时密钥时,时间戳加 durationSeconds
  31. });
  32. },
  33. });
  34. let fileObject = file.target.files[0];
  35. let Key = fileObject.name;
  36. let pos = Key.lastIndexOf('.');
  37. let suffix = '';
  38. if (pos !== -1) {
  39. suffix = Key.substring(pos);
  40. }
  41. let filename = new Date().getTime() + suffix;
  42. return new Promise((resolve, reject) => {
  43. cos.sliceUploadFile(
  44. {
  45. Bucket: config.bucket /* 必须 */,
  46. Region: config.region /* 必须 */,
  47. Key: filename /* 必须 */,
  48. Body: fileObject, // 上传文件对象
  49. onProgress: function (progressData) {
  50. uploading(progressData);
  51. },
  52. },
  53. function (err, data) {
  54. if (err) {
  55. reject({ msg: err });
  56. } else {
  57. resolve({ url: 'http://' + data.Location, ETag: data.ETag });
  58. }
  59. },
  60. );
  61. });
  62. },
  63. cosHttp(evfile, res, videoIng) {
  64. // 腾讯云
  65. // 对更多字符编码的 url encode 格式
  66. let camSafeUrlEncode = function (str) {
  67. return encodeURIComponent(str)
  68. .replace(/!/g, '%21')
  69. .replace(/'/g, '%27')
  70. .replace(/\(/g, '%28')
  71. .replace(/\)/g, '%29')
  72. .replace(/\*/g, '%2A');
  73. };
  74. let fileObject = evfile.target.files[0];
  75. let Key = fileObject.name;
  76. let pos = Key.lastIndexOf('.');
  77. let suffix = '';
  78. if (pos !== -1) {
  79. suffix = Key.substring(pos);
  80. }
  81. let filename = new Date().getTime() + suffix;
  82. let data = res.data;
  83. let XCosSecurityToken = data.credentials.sessionToken;
  84. let url = data.url + camSafeUrlEncode(filename).replace(/%2F/g, '/');
  85. let xhr = new XMLHttpRequest();
  86. xhr.open('PUT', url, true);
  87. XCosSecurityToken && xhr.setRequestHeader('x-cos-security-token', XCosSecurityToken);
  88. xhr.upload.onprogress = function (e) {
  89. let progress = Math.round((e.loaded / e.total) * 10000) / 100;
  90. videoIng(true, progress);
  91. };
  92. return new Promise((resolve, reject) => {
  93. xhr.onload = function () {
  94. if (/^2\d\d$/.test('' + xhr.status)) {
  95. var ETag = xhr.getResponseHeader('etag');
  96. videoIng(false, 0);
  97. resolve({ url: url, ETag: ETag });
  98. } else {
  99. reject({ msg: '文件 ' + filename + ' 上传失败,状态码:' + xhr.statu });
  100. }
  101. };
  102. xhr.onerror = function () {
  103. reject({ msg: '文件 ' + filename + '上传失败,请检查是否没配置 CORS 跨域规' });
  104. };
  105. xhr.send(fileObject);
  106. xhr.onreadystatechange = function () {};
  107. });
  108. },
  109. ossHttp(evfile, res, videoIng) {
  110. let that = this;
  111. let fileObject = evfile.target.files[0];
  112. let file = fileObject.name;
  113. let pos = file.lastIndexOf('.');
  114. let suffix = '';
  115. if (pos !== -1) {
  116. suffix = file.substring(pos);
  117. }
  118. let filename = new Date().getTime() + suffix;
  119. let formData = new FormData();
  120. let data = res.data;
  121. // 注意formData里append添加的键的大小写
  122. formData.append('key', filename); // 存储在oss的文件路径
  123. formData.append('OSSAccessKeyId', data.accessid); // accessKeyId
  124. formData.append('policy', data.policy); // policy
  125. formData.append('Signature', data.signature); // 签名
  126. // 如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
  127. formData.append('file', fileObject);
  128. formData.append('success_action_status', 200); // 成功后返回的操作码
  129. let url = data.host;
  130. let fileUrl = url + '/' + filename;
  131. videoIng(true, 100);
  132. return new Promise((resolve, reject) => {
  133. axios.defaults.withCredentials = false;
  134. axios
  135. .post(url, formData)
  136. .then(() => {
  137. // that.progress = 0;
  138. videoIng(false, 0);
  139. resolve({ url: fileUrl });
  140. })
  141. .catch((res) => {
  142. reject({ msg: res });
  143. });
  144. });
  145. },
  146. qiniuHttp(evfile, res, videoIng) {
  147. let uptoken = res.data.token;
  148. let file = evfile.target.files[0]; // Blob 对象,上传的文件
  149. let Key = file.name; // 上传后文件资源名以设置的 key 为主,如果 key 为 null 或者 undefined,则文件资源名会以 hash 值作为资源名。
  150. let pos = Key.lastIndexOf('.');
  151. let suffix = '';
  152. if (pos !== -1) {
  153. suffix = Key.substring(pos);
  154. }
  155. let filename = new Date().getTime() + suffix;
  156. let fileUrl = res.data.domain + '/' + filename;
  157. let config = {
  158. useCdnDomain: true,
  159. };
  160. let putExtra = {
  161. fname: '', // 文件原文件名
  162. params: {}, // 用来放置自定义变量
  163. mimeType: null, // 用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
  164. };
  165. let observable = qiniu.upload(file, filename, uptoken, putExtra, config);
  166. return new Promise((resolve, reject) => {
  167. observable.subscribe({
  168. next: (result) => {
  169. let progress = Math.round(result.total.loaded / result.total.size);
  170. videoIng(true, progress);
  171. // 主要用来展示进度
  172. },
  173. error: (errResult) => {
  174. // 失败报错信息
  175. reject({ msg: errResult });
  176. },
  177. complete: (result) => {
  178. // 接收成功后返回的信息
  179. videoIng(false, 0);
  180. resolve({ url: fileUrl });
  181. },
  182. });
  183. });
  184. },
  185. };