| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- import * as Vue from 'vue'
- import router from '@/router'
- import config from '@/config/reSource'
- import { message } from 'ant-design-vue'
- import { fileImgMap, unknownImg, fileSuffixCodeModeMap, markdownFileType } from '@/libs/map.js'
- import { officeFileType } from '@/libs/map.js'
- import fileOperationPlugins from '@/libs/fileOperationPlugins.js'
- import { useMyResourceStore } from '@/store/myResource'
- // 全局函数 - 文件相关
- const fileFunction = {
- /**
- * 格式化文件大小
- * @param {number} size 文件大小
- * @param {boolean} isInteger 是否只显示整数位,默认不截取
- * @returns {string} 文件大小(带单位)
- */
- calculateFileSize(size, isInteger = false) {
- const B = 1024
- const KB = Math.pow(1024, 2)
- const MB = Math.pow(1024, 3)
- const GB = Math.pow(1024, 4)
- if (isInteger) {
- // 截取为整数
- if (size < B) {
- return `${size}B`
- } else if (size < KB) {
- return `${(size / B).toFixed(0)}KB`
- } else if (size < MB) {
- return `${(size / KB).toFixed(0)}MB`
- } else if (size < GB) {
- return `${(size / MB).toFixed(0)}GB`
- } else {
- return `${(size / GB).toFixed(0)}TB`
- }
- } else {
- // 保留小数位
- if (size < B) {
- return `${size}B`
- } else if (size < KB) {
- return `${(size / B).toFixed(0)}KB`
- } else if (size < MB) {
- return `${(size / KB).toFixed(1)}MB`
- } else if (size < GB) {
- return `${(size / MB).toFixed(2)}GB`
- } else {
- return `${(size / GB).toFixed(3)}TB`
- }
- }
- },
- /**
- * 获取流式的缩略图、视频封面图
- * @param {object} row 文件信息
- * @returns {string} 流式图片
- */
- getMinImgStream(row) {
- return `${config.baseContext}/filetransfer/preview?userFileId=${row.userFileId}&isMin=true&shareBatchNum=${
- row.shareBatchNum == null ? '' : row.shareBatchNum
- }&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
- },
- /**
- * 获取文件查看路径
- * @param {object} row 文件信息
- * @returns {string} 文件路径
- */
- getViewFilePath(row) {
- return `${config.baseContext}/filetransfer/preview?userFileId=${row.userFileId}&isMin=false&shareBatchNum=${
- row.shareBatchNum == null ? '' : row.shareBatchNum
- }&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
- },
- /**
- * 获取文件下载路径
- * @param {object} row 文件信息
- * @returns {string} 文件下载路径
- */
- getDownloadFilePath(row) {
- return `${config.baseContext}/filetransfer/downloadfile?userFileId=${row.userFileId}&shareBatchNum=${
- row.shareBatchNum == null ? '' : row.shareBatchNum
- }&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
- },
- getDownloadFilePath2(row) {
- return `${config.baseContext}/filetransfer/downloadfile?userFileId=${row.userFileId}&shareBatchNum=${
- row.shareBatchNum == null ? '' : row.shareBatchNum
- }&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}&admin=true`
- },
- getDownloadFilePath3(row) {
- return `${config.baseContext}/resourceFile/downloadfile?userFileIds=${row.fileId}`
- },
- /**
- * 获取 Onlyoffice 文件创建路径
- * @param {object} row
- * @returns {string} office 文件创建路径
- */
- createFileOnlineByOffice(data) {
- let fileUrl = `${location.protocol}//${location.host}${config.baseContext}`
- const { href } = router.resolve({
- name: 'Onlyoffice',
- query: {
- fileUrl: fileUrl,
- fileName: data.fileName,
- filePath: data.filePath,
- extendName: data.extendName,
- ot: 'add'
- }
- })
- window.open(href, '_blank')
- },
- /**
- * 获取 Onlyoffice 文件在线预览路径
- * @param {object} row
- * @returns {string} office 文件在线预览路径
- */
- getFileOnlineViewPathByOffice(row) {
- let userFileId = row.userFileId
- const { href } = router.resolve({
- name: 'Onlyoffice',
- query: {
- userFileId: userFileId,
- ot: 'detail'
- }
- })
- window.open(href, '_blank')
- },
- /**
- * 获取 Onlyoffice 文件在线编辑路径
- * @param {object} row
- * @returns {string} office 文件在线编辑路径
- */
- getFileOnlineEditPathByOffice(row) {
- let userFileId = row.userFileId
- const { href } = router.resolve({
- name: 'Onlyoffice',
- query: {
- userFileId: userFileId,
- ot: 'edit'
- }
- })
- window.open(href, '_blank')
- },
- /**
- * 获取分享链接
- * @param {string} shareBatchNum
- * @returns {string} 完整的分享链接
- */
- getShareLink(shareBatchNum) {
- return `${location.protocol}//${location.host}/share/${shareBatchNum}`
- },
- /**
- * 复制分享链接
- * @param {string} shareBatchNum
- * @param {string} extractionCode
- */
- copyShareLink(shareBatchNum, extractionCode) {
- let input = document.createElement('textarea') // 直接构建textarea以保持换行
- input.value =
- extractionCode === null
- ? `分享链接:${this.getShareLink(shareBatchNum)}\n复制链接到浏览器中并输入提取码即可查看文件`
- : `分享链接:${this.getShareLink(
- shareBatchNum
- )}\n提取码:${extractionCode}\n复制链接到浏览器中并输入提取码即可查看文件` // 设置内容
- document.body.appendChild(input) // 添加临时实例
- input.select() // 选择实例内容
- document.execCommand('Copy') // 执行复制
- document.body.removeChild(input) // 删除临时实例
- message.success('复制成功')
- },
- /**
- * 根据文件扩展名设置文件图片
- * @param {object} file 文件信息
- */
- setFileImg(file) {
- if (file.isDir === 1) {
- // 文件夹
- return fileImgMap.get('dir')
- } else if (
- Number(router.currentRoute.value.query.fileType) !== 6 &&
- ['jpg', 'png', 'jpeg', 'gif', 'mp4', 'webp'].includes(file.extendName.toLowerCase())
- ) {
- // 图片、视频类型,直接显示缩略图
- return this.getMinImgStream(file)
- } else if (fileImgMap.has(file.extendName.toLowerCase())) {
- // 可以识别文件类型的文件
- return fileImgMap.get(file.extendName.toLowerCase())
- } else {
- // 无法识别文件类型的文件
- return unknownImg
- }
- },
- /**
- * 判断是否是视频文件
- * @param {object} file 文件信息
- */
- isVideoFile(file) {
- if (['avi', 'mp4', 'mpg', 'mov', 'swf'].includes(file.extendName?.toLowerCase())) {
- return true
- } else {
- return false
- }
- },
- /**
- * 图片预览
- * @param {*} currentIndex 当前图片索引
- * @param {*} imgInfo 单个图片信息
- * @param {*} imgInfoList 多个图片列表
- */
- handleImgPreview(currentIndex, imgInfo = {}, imgInfoList = []) {
- const myResourceStore = useMyResourceStore()
- const fileType = myResourceStore.getQuery.fileType
- // 图片分类下 - 传递整个页面的图片列表;非图片分类下 - 由单个图片构建图片列表
- const imgList =
- fileType && Number(fileType) === 1
- ? imgInfoList.map((item) => {
- return {
- ...item,
- fileUrl: this.getViewFilePath(item),
- downloadLink: this.getDownloadFilePath(item)
- }
- })
- : [
- {
- ...imgInfo,
- fileUrl: this.getViewFilePath(imgInfo),
- downloadLink: this.getDownloadFilePath(imgInfo)
- }
- ]
- const defaultIndex = fileType && Number(fileType) === 1 ? currentIndex : 0
- fileOperationPlugins.openBox.imgPreview({ imgList, defaultIndex })
- },
- /**
- * 视频预览
- * @param {*} currentIndex 当前视频索引
- * @param {*} videoInfo 单个视频信息
- * @param {*} videoInfoList 多个视频列表
- */
- handleVideoPreview(currentIndex, videoInfo = {}, videoInfoList = []) {
- const myResourceStore = useMyResourceStore()
- const fileType = myResourceStore.getQuery.fileType
- // 视频分类下 - 传递整个页面的视频列表;非视频分类下 - 由单个视频构建视频列表
- const videoList =
- fileType && Number(fileType) === 3
- ? videoInfoList.map((item) => {
- return {
- ...item,
- fileUrl: this.getViewFilePath(item),
- downloadLink: this.getDownloadFilePath(item)
- }
- })
- : [
- {
- ...videoInfo,
- fileUrl: this.getViewFilePath(videoInfo),
- downloadLink: this.getDownloadFilePath(videoInfo)
- }
- ]
- const defaultIndex = fileType && Number(fileType) === 3 ? currentIndex : 0
- fileOperationPlugins.openBox.videoPreview({ videoList, defaultIndex })
- },
- /**
- * 音频预览
- * @param {*} currentIndex 当前音频索引
- * @param {*} audioInfo 单个音频信息
- * @param {*} audioInfoList 多个音频列表
- */
- handleAudioPreview(currentIndex, audioInfo = {}, audioInfoList = []) {
- const myResourceStore = useMyResourceStore()
- const fileType = myResourceStore.getQuery.fileType
- // 音频分类下 - 传递整个页面的音频列表;非音频分类下 - 由单个音频构建音频列表
- const audioList =
- fileType && Number(fileType) === 4
- ? audioInfoList.map((item) => {
- return {
- ...item,
- fileUrl: this.getViewFilePath(item),
- downloadLink: this.getDownloadFilePath(item)
- }
- })
- : [
- {
- ...audioInfo,
- fileUrl: this.getViewFilePath(audioInfo),
- downloadLink: this.getDownloadFilePath(audioInfo)
- }
- ]
- const defaultIndex = fileType && Number(fileType) === 4 ? currentIndex : 0
- fileOperationPlugins.openBox.audioPreview({ audioList, defaultIndex })
- },
- /**
- * 文件预览
- * @description 若当前点击的为文件夹,则进入文件夹内部;若是文件,则进行相应的预览。
- * @param {object} row 文件信息
- * @param {number} currentIndex 当前文件索引
- * @param {array} fileList 文件列表
- */
- handleFileNameClick(row, currentIndex, fileList = []) {
- const myResourceStore = useMyResourceStore()
- // 如果当前文件在回收站中,则不允许预览
- if (row.deleteFlag !== undefined && row.deleteFlag !== 0) {
- return false
- }
- // 若是文件夹则进入该文件夹
- if (row.isDir) {
- if (router.currentRoute.value.name === 'Share') {
- // 当前是查看他人分享列表的页面
- myResourceStore.changeQuery({
- filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName}`
- })
- // router.push({
- // query: {
- // filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName}`
- // }
- // })
- } else if (Number(router.currentRoute.value.query.fileType) === 8) {
- // 当前是我的已分享列表页面
- myResourceStore.changeQuery({
- fileType: 8,
- filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName}`,
- shareBatchNum: row.shareBatchNum
- })
- // router.push({
- // query: {
- // fileType: 8,
- // filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName}`,
- // shareBatchNum: row.shareBatchNum
- // }
- // })
- } else if (Number(router.currentRoute.value.query.fileType) !== 6) {
- // 回收站页面不允许打开文件夹
- // 网盘页面
- myResourceStore.changeQuery({
- filePath: `${row.filePath === '/' ? '' : row.filePath}/${row.fileName}`,
- fileType: 0
- })
- // router.push({
- // query: {
- // filePath: `${row.filePath === '/' ? '' : row.filePath}/${row.fileName}`,
- // fileType: 0
- // }
- // })
- }
- }
- // 若是文件,则进行相应的预览
- else {
- // 若当前点击项是图片
- const PIC = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp']
- if (PIC.includes(row.extendName.toLowerCase())) {
- this.handleImgPreview(currentIndex, row, fileList)
- return false
- }
- // 若当前点击项是可以使用office在线预览的
- if ([...officeFileType].includes(row.extendName.toLowerCase())) {
- // this.getFileOnlineViewPathByOffice(row)
- return false
- }
- // 若当前点击项是pdf
- if (row.extendName.toLowerCase() === 'pdf') {
- // window.open(this.getViewFilePath(row), '_blank')
- }
- // 若当前点击项是代码或文本文件
- let codeFileSuffix = row.extendName.toLowerCase()
- if (codeFileSuffix === 'yaml') {
- codeFileSuffix = 'yml'
- }
- // 无格式文件也可以在线编辑
- if (fileSuffixCodeModeMap.has(codeFileSuffix) || (row.isDir === 0 && row.extendName === '')) {
- fileOperationPlugins.openBox.codePreview({ fileInfo: row, isEdit: false })
- return false
- }
- // 若当前点击项是 markdown 文档
- if (markdownFileType.includes(row.extendName.toLowerCase())) {
- fileOperationPlugins.openBox.markdownPreview({
- fileInfo: row,
- editable: false
- })
- return false
- }
- // 若当前点击项是视频mp4格式
- const VIDEO = ['mp4']
- if (VIDEO.includes(row.extendName.toLowerCase())) {
- this.handleVideoPreview(currentIndex, row, fileList)
- return false
- }
- // 若当前点击项是音频 mp3、flac 格式
- const AUDIO = ['mp3', 'flac']
- if (AUDIO.includes(row.extendName.toLowerCase())) {
- this.handleAudioPreview(currentIndex, row, fileList)
- return false
- }
- }
- },
- /**
- * 文件名称拼接,包括文件名称 + 文件后缀
- * @param {object} file 文件信息
- * @param {boolean} isHighlight 是否需要展示高亮效果,默认不需要
- * @returns {string} 完整文件名称
- */
- getFileNameComplete(file, isHighlight = false) {
- return isHighlight === true && file.highlightFields
- ? `${file.highlightFields}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''}`
- : `${file.fileName}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''}`
- },
- /**
- * 文件类型
- * @param {object} file 文件信息
- */
- getFileType(file) {
- return file.isDir === 1 ? '文件夹' : file.extendName ? file.extendName : '文件'
- },
- /**
- * 获取文件分享过期状态
- * @param {string} time 日期
- * @returns {boolean} 是否过期
- */
- getFileShareStatus(time) {
- if (new Date(time).getTime() > new Date().getTime()) {
- return false
- } else {
- return true
- }
- }
- }
- export default fileFunction
|