common.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import SparkMD5 from "spark-md5"
  2. import { ElMessage } from 'element-plus'
  3. export default {
  4. /* 时间格式化 */
  5. formatTime(timestamp, fmt = 'yyyy-MM-dd hh:mm:ss') {
  6. let d = new Date()
  7. d.setTime(timestamp)
  8. var o = {
  9. 'M+': d.getMonth() + 1, //月份
  10. 'd+': d.getDate(), //日
  11. 'h+': d.getHours(), //小时
  12. 'm+': d.getMinutes(), //分
  13. 's+': d.getSeconds(), //秒
  14. 'q+': Math.floor((d.getMonth() + 3) / 3), //季度
  15. 'S': d.getMilliseconds() //毫秒
  16. }
  17. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
  18. for (var k in o)
  19. if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((
  20. '00' + o[
  21. k]).substr(('' + o[k]).length)))
  22. return fmt
  23. },
  24. /* 获取视频文件的持续时长 */
  25. getVideoDuration(file, url) {
  26. return new Promise((resolve, reject) => {
  27. console.log('ferhth', file);
  28. var vid = document.createElement('video');
  29. var fileURL = url || window.URL.createObjectURL(file);
  30. vid.src = fileURL;
  31. vid.addEventListener('loadedmetadata', function () {
  32. resolve(vid.duration);
  33. });
  34. vid.remove()
  35. })
  36. },
  37. /* 将文件MD5 Uint8Array格式转换成字符串 */
  38. convertFileMD5ToString(fileData) {
  39. var dataString = "";
  40. for (var i = 0; i < fileData.length; i++) {
  41. dataString += fileData[i].toString(16);
  42. }
  43. return dataString
  44. },
  45. /* 获取文件的MD5 */
  46. getFileMD5(file) {
  47. return new Promise((resolve, reject) => {
  48. const CHUNK_SIZE = 4194304
  49. const fileReader = new FileReader()
  50. const chunkFile = file.slice(0, CHUNK_SIZE)
  51. fileReader.readAsBinaryString(chunkFile)
  52. let spark = new SparkMD5()
  53. fileReader.onload = e => {
  54. spark.appendBinary(e.target.result)
  55. var md5 = spark.end(true)
  56. resolve(this.stringToUint8Array(md5))
  57. }
  58. })
  59. },
  60. /* 检查音视频格式是否符合格式要求 */
  61. checkMediaFile(file) {
  62. return new Promise((r, j) => {
  63. const getSize = () => file.size
  64. const readChunk = (chunkSize, offset) => new Promise((resolve, reject) => {
  65. const reader = new FileReader()
  66. reader.onload = (event) => {
  67. if (event.target.error) {
  68. reject(event.target.error)
  69. }
  70. resolve(new Uint8Array(event.target.result))
  71. }
  72. reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize))
  73. })
  74. window.MediaInfo().then((media) => {
  75. media.analyzeData(getSize, readChunk).then((result) => {
  76. console.log(result)
  77. if (result['media']) {
  78. let tracks = result['media']['track']
  79. // 判断是否是视频
  80. let videoTrack = tracks.find(track => track['@type'] === 'Video')
  81. let audioTrack = tracks.find(track => track['@type'] === 'Audio')
  82. // 如果视频文件满足MP4(H264+AAC),WAV('vp8','vp9') 则代表是可以正常播放的视频文件,返回视频的编码级别
  83. if (videoTrack && audioTrack) {
  84. let videoFormat = videoTrack.Format.toLowerCase()
  85. let audioFormat = audioTrack.Format.toLowerCase()
  86. if ((videoFormat === 'avc' && audioFormat === 'aac') || (['vp8', 'vp9'].includes(videoFormat) && audioFormat === 'vorbis')) {
  87. r(videoTrack.Format_Profile || true)
  88. } else {
  89. r(false)
  90. }
  91. }
  92. // 如果是只有视频轨没有音频轨(PPT直接转视频)
  93. else if (videoTrack && !audioTrack) {
  94. let videoFormat = videoTrack.Format.toLowerCase()
  95. if (videoFormat === 'avc') {
  96. ElMessage({
  97. type: 'warning',
  98. message: '视频文件未检测到音频轨,建议您调整后重新上传'
  99. })
  100. r(true)
  101. } else {
  102. r(false)
  103. }
  104. }
  105. // 如果是音频文件则需要满足 mp3(MPEG Audio),ogg(Vorbis),wav(PCM) 任意一种编码格式
  106. else if (!videoTrack && audioTrack && ['mpeg audio', 'vorbis', 'pcm'].includes(audioTrack.Format.toLowerCase())) {
  107. r(true)
  108. } else {
  109. r(false)
  110. }
  111. } else {
  112. r(false)
  113. }
  114. }).catch((error) => {
  115. console.log('error', error);
  116. j(error)
  117. })
  118. }).catch((error) => {
  119. console.log('error', error);
  120. j(error)
  121. })
  122. })
  123. },
  124. /* 将二进制流字符串转换成Uint8Array */
  125. stringToUint8Array(str) {
  126. var arr = [];
  127. for (var i = 0, j = str.length; i < j; ++i) {
  128. arr.push(str.charCodeAt(i));
  129. }
  130. var tmpUint8Array = new Uint8Array(arr);
  131. return tmpUint8Array
  132. },
  133. /* 根据地址获取blobHOST域名 */
  134. getBlobHost(url) {
  135. let s = url
  136. let pattern = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/
  137. return s.split('//')[0] + '//' + s.match(pattern)[0]
  138. },
  139. /* 获取文件后缀名 */
  140. getSuffix(name) {
  141. return name.substr(name.lastIndexOf(".") + 1)
  142. },
  143. getFileThum(type, fileName) {
  144. const docType = ['doc', 'docx']
  145. const excelType = ['xls', 'csv', 'xlsx']
  146. const pptType = ['ppt', 'pptx']
  147. let thumPath = ''
  148. if (type === 'doc' && docType.includes(this.getSuffix(fileName))) {
  149. thumPath = require('@/assets/source/word.png')
  150. } else if (type === 'doc' && excelType.includes(this.getSuffix(fileName))) {
  151. thumPath = require('@/assets/source/excel.png')
  152. } else if (type === 'doc' && pptType.includes(this.getSuffix(fileName))) {
  153. thumPath = require('@/assets/source/ppt.png')
  154. } else if (type === 'image') {
  155. thumPath = require('@/assets/source/image.png')
  156. } else if (type === 'video') {
  157. thumPath = require('@/assets/source/video.png')
  158. } else if (type === 'audio') {
  159. thumPath = require('@/assets/source/audio.png')
  160. } else if (type === 'link') {
  161. thumPath = require('@/assets/source/link.png')
  162. } else if (type === 'res') {
  163. thumPath = require('@/assets/source/zip.png')
  164. } else if (type === 'thum') {
  165. thumPath = require('@/assets/source/image.png')
  166. } else {
  167. thumPath = require('@/assets/source/link.png')
  168. }
  169. return thumPath
  170. },
  171. /* 弹窗下载文件操作 */
  172. doDownloadByUrl(url, fileName) {
  173. let a = document.createElement('a');
  174. a.href = url;
  175. a.download = fileName;
  176. a.target = '_blank'
  177. a.click()
  178. a.remove();
  179. },
  180. }