import SparkMD5 from "spark-md5" import { ElMessage } from 'element-plus' export default { /* 时间格式化 */ formatTime(timestamp, fmt = 'yyyy-MM-dd hh:mm:ss') { let d = new Date() d.setTime(timestamp) var o = { 'M+': d.getMonth() + 1, //月份 'd+': d.getDate(), //日 'h+': d.getHours(), //小时 'm+': d.getMinutes(), //分 's+': d.getSeconds(), //秒 'q+': Math.floor((d.getMonth() + 3) / 3), //季度 'S': d.getMilliseconds() //毫秒 } if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length)) for (var k in o) if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (( '00' + o[ k]).substr(('' + o[k]).length))) return fmt }, /* 获取视频文件的持续时长 */ getVideoDuration(file, url) { return new Promise((resolve, reject) => { console.log('ferhth', file); var vid = document.createElement('video'); var fileURL = url || window.URL.createObjectURL(file); vid.src = fileURL; vid.addEventListener('loadedmetadata', function () { resolve(vid.duration); }); vid.remove() }) }, /* 将文件MD5 Uint8Array格式转换成字符串 */ convertFileMD5ToString(fileData) { var dataString = ""; for (var i = 0; i < fileData.length; i++) { dataString += fileData[i].toString(16); } return dataString }, /* 获取文件的MD5 */ getFileMD5(file) { return new Promise((resolve, reject) => { const CHUNK_SIZE = 4194304 const fileReader = new FileReader() const chunkFile = file.slice(0, CHUNK_SIZE) fileReader.readAsBinaryString(chunkFile) let spark = new SparkMD5() fileReader.onload = e => { spark.appendBinary(e.target.result) var md5 = spark.end(true) resolve(this.stringToUint8Array(md5)) } }) }, /* 检查音视频格式是否符合格式要求 */ checkMediaFile(file) { return new Promise((r, j) => { const getSize = () => file.size const readChunk = (chunkSize, offset) => new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = (event) => { if (event.target.error) { reject(event.target.error) } resolve(new Uint8Array(event.target.result)) } reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize)) }) window.MediaInfo().then((media) => { media.analyzeData(getSize, readChunk).then((result) => { console.log(result) if (result['media']) { let tracks = result['media']['track'] // 判断是否是视频 let videoTrack = tracks.find(track => track['@type'] === 'Video') let audioTrack = tracks.find(track => track['@type'] === 'Audio') // 如果视频文件满足MP4(H264+AAC),WAV('vp8','vp9') 则代表是可以正常播放的视频文件,返回视频的编码级别 if (videoTrack && audioTrack) { let videoFormat = videoTrack.Format.toLowerCase() let audioFormat = audioTrack.Format.toLowerCase() if ((videoFormat === 'avc' && audioFormat === 'aac') || (['vp8', 'vp9'].includes(videoFormat) && audioFormat === 'vorbis')) { r(videoTrack.Format_Profile || true) } else { r(false) } } // 如果是只有视频轨没有音频轨(PPT直接转视频) else if (videoTrack && !audioTrack) { let videoFormat = videoTrack.Format.toLowerCase() if (videoFormat === 'avc') { ElMessage({ type: 'warning', message: '视频文件未检测到音频轨,建议您调整后重新上传' }) r(true) } else { r(false) } } // 如果是音频文件则需要满足 mp3(MPEG Audio),ogg(Vorbis),wav(PCM) 任意一种编码格式 else if (!videoTrack && audioTrack && ['mpeg audio', 'vorbis', 'pcm'].includes(audioTrack.Format.toLowerCase())) { r(true) } else { r(false) } } else { r(false) } }).catch((error) => { console.log('error', error); j(error) }) }).catch((error) => { console.log('error', error); j(error) }) }) }, /* 将二进制流字符串转换成Uint8Array */ stringToUint8Array(str) { var arr = []; for (var i = 0, j = str.length; i < j; ++i) { arr.push(str.charCodeAt(i)); } var tmpUint8Array = new Uint8Array(arr); return tmpUint8Array }, /* 根据地址获取blobHOST域名 */ getBlobHost(url) { let s = url let pattern = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/ return s.split('//')[0] + '//' + s.match(pattern)[0] }, /* 获取文件后缀名 */ getSuffix(name) { return name.substr(name.lastIndexOf(".") + 1) }, getFileThum(type, fileName) { const docType = ['doc', 'docx'] const excelType = ['xls', 'csv', 'xlsx'] const pptType = ['ppt', 'pptx'] let thumPath = '' if (type === 'doc' && docType.includes(this.getSuffix(fileName))) { thumPath = require('@/assets/source/word.png') } else if (type === 'doc' && excelType.includes(this.getSuffix(fileName))) { thumPath = require('@/assets/source/excel.png') } else if (type === 'doc' && pptType.includes(this.getSuffix(fileName))) { thumPath = require('@/assets/source/ppt.png') } else if (type === 'image') { thumPath = require('@/assets/source/image.png') } else if (type === 'video') { thumPath = require('@/assets/source/video.png') } else if (type === 'audio') { thumPath = require('@/assets/source/audio.png') } else if (type === 'link') { thumPath = require('@/assets/source/link.png') } else if (type === 'res') { thumPath = require('@/assets/source/zip.png') } else if (type === 'thum') { thumPath = require('@/assets/source/image.png') } else { thumPath = require('@/assets/source/link.png') } return thumPath }, /* 弹窗下载文件操作 */ doDownloadByUrl(url, fileName) { let a = document.createElement('a'); a.href = url; a.download = fileName; a.target = '_blank' a.click() a.remove(); }, }