liding
5 天以前 c16edc131625d4d7dd3624cc1485695bfb89707d
src/plugins/download.js
@@ -4,6 +4,8 @@
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { blobValidate } from '@/utils/ruoyi'
import { getJavaApi } from '@/utils/java-api'
import { resolveAttachmentUrl, attachmentFileName, alternateImageAttachmentUrl, validateAttachmentBlob } from '@/utils/attachment'
const baseURL = import.meta.env.VITE_APP_BASE_API
let downloadLoadingInstance
@@ -67,7 +69,51 @@
    })
  },
  saveAs(text, name, opts) {
    saveAs(text, name, opts)
    if (typeof text === 'string') return this.url(text, name, opts)
    return saveAs(text, name, opts)
  },
  attachment(file, name) {
    try {
      return this.url(resolveAttachmentUrl(file?.fileUrl, file?.type), name || file?.fileName, undefined,
        ![1, 2].includes(Number(file?.type)))
    } catch (error) {
      ElMessage.error(error.message)
      return Promise.resolve(false)
    }
  },
  async url(path, name, opts, allowAlternative = true) {
    try {
      const url = resolveAttachmentUrl(path)
      const backend = new URL(getJavaApi(), window.location.origin)
      const target = new URL(url, window.location.origin)
      const isBackend = target.origin === backend.origin
        && (target.pathname === backend.pathname || target.pathname.startsWith(backend.pathname.replace(/\/$/, '') + '/'))
      const filename = attachmentFileName(url, name)
      // 外部附件沿用浏览器下载,兼容不允许跨域读取的文件服务。
      if (!isBackend && /^https?:$/.test(target.protocol)) {
        saveAs(url, filename, opts)
        return true
      }
      const headers = isBackend && getToken() ? { Authorization: 'Bearer ' + getToken() } : {}
      let response
      try {
        response = await axios.get(url, { responseType: 'blob', headers })
      } catch (error) {
        const alternative = isBackend && allowAlternative && error.response?.status === 404
          ? alternateImageAttachmentUrl(url) : null
        if (!alternative) throw error
        response = await axios.get(alternative, { responseType: 'blob', headers })
      }
      const { data } = response
      await validateAttachmentBlob(data, filename)
      saveAs(data, filename, opts)
      return true
    } catch (error) {
      const status = error.response?.status
      ElMessage.error(status === 404 ? '附件不存在或已被删除' : status === 401 || status === 403
        ? '登录已过期或没有附件下载权限' : error.message || '附件下载失败,请稍后重试')
      return false
    }
  },
  async printErrMsg(data) {
    const resText = await data.text()