吴羡
4 天以前 0a40c5890d13d9f2de5c3ab663876afecbfbefbe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import { saveAs } from 'file-saver'
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
 
export default {
  name(name, isDelete = true) {
    var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data)
      if (isBlob) {
        const blob = new Blob([res.data])
        this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
      } else {
        this.printErrMsg(res.data)
      }
    })
  },
  resource(resource) {
    var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource)
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data)
      if (isBlob) {
        const blob = new Blob([res.data])
        this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
      } else {
        this.printErrMsg(res.data)
      }
    })
  },
  zip(url, name) {
    var url = baseURL + url
    downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data)
      if (isBlob) {
        const blob = new Blob([res.data], { type: 'application/zip' })
        this.saveAs(blob, name)
      } else {
        this.printErrMsg(res.data)
      }
      downloadLoadingInstance.close()
    }).catch((r) => {
      console.error(r)
      ElMessage.error('下载文件出现错误,请联系管理员!')
      downloadLoadingInstance.close()
    })
  },
  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()
    const rspObj = JSON.parse(resText)
    const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
    ElMessage.error(errMsg)
  }
}