吴羡
10 小时以前 c6e96cdb8b1cfb51e9a45bf86c38d1353e983127
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
import { ElMessage } from 'element-plus'
import { saveAs } from 'file-saver'
 
/**
 * 保存接口返回的二进制文件;若后端实际返回的是错误 JSON,则提示错误而不是存成坏文件。
 * @param {Blob} data 请求返回的 blob
 * @param {string} filename 下载文件名
 * @param {string} mime 文件类型
 */
export function saveBlobOrShowError(data, filename, mime = 'application/octet-stream') {
  const reader = new FileReader()
  reader.readAsText(data, 'utf-8')
  reader.onload = () => {
    const text = (reader.result || '').trim()
    if (text.startsWith('{') || text.startsWith('[')) {
      let msg = '导出失败'
      try {
        msg = JSON.parse(text).msg || msg
      } catch (e) {
        // 非标准错误结构,保留默认提示
      }
      ElMessage.error(msg)
    } else {
      saveAs(new Blob([data], { type: mime }), filename)
    }
  }
  reader.onerror = () => {
    saveAs(new Blob([data], { type: mime }), filename)
  }
}