关于下载功能

  • 需求:下载日志,大小不固定,需要导出tar.gz文件格式的包
  • 项目框架:Vue
  • 问题描述:
// 开发日志-下载
export function downloadDevelopLog (data) {
  return axios({
    url: '/log/hosts:download',
    method: 'post',
    data
  })
}
const FileSaver = require('file-saver') // 使用的插件

downloadDevelopLog({ ids: this.selectedRowKeys }).then(res => {
   const disposition = res.headers['content-disposition']
   const str = disposition.split('; ')[1]
   const fileName = str.substring(str.indexOf('filename="') + 10, str.length - 1)
   
   // 方式一
   // application/x-tar
   FileSaver.saveAs(new Blob([res.data], { type: 'application/x-tar' }), fileName)
   
   // 方式二
   // const url = window.URL.createObjectURL(new Blob([res.data]))
   // const link = document.createElement('a')
   // link.style.display = 'none'
   // link.href = url
   // link.setAttribute('download', fileName)
   // document.body.appendChild(link)
   // link.click()
   // window.URL.revokeObjectURL(link.href)
   // document.body.removeChild(link)
 })

经上述代码运行,发现能正常导出文件,但是压缩包解压失败,本来以为是接口的问题,后来发现是请求接口没有指定responseType为‘blob’格式

正确的写法是:

// 开发日志-下载
export function downloadDevelopLog (data) {
  return axios({
    url: '/log/hosts:download',
    method: 'post',
    responseType: 'blob', // 指定正确的格式
    data
  })
}

================= 关于导出文件名:fileName ========================
如果文件自己指定fileName,那么前端可以任意指定,如果不是前端指定,可以从接口的响应头中的’content-disposition’中读取

================= responseType 的知识补充 ========================
对于下载文件模式的请求,responseType一般可以指定为’blob’,或者’arraybuffer’,
上述case,把responseType的类型指定为arraybuffer,尝试之后也是可以正常导出并解压成功的。

XMLHttpRequest 本身是支持responseType的:
参照文档 MDN Web Docs 中相关知识点【 XMLHttpRequest.responseType】的查看

responseType:'' // 空的 responseType 字符串与默认类型 "text" 相同。

responseType:'arraybuffer' // response 是一个包含二进制数据的 JavaScript ArrayBuffer

responseType:'blob' // response 是一个包含二进制数据的 Blob 对象。

responseType:'document' // response 是一个 HTML Document 或 XML XMLDocument,这取决于接收到的数据的 MIME 类型。请参阅 XMLHttpRequest 中的 HTML 以了解使用 XHR 获取 HTML 内容的更多信息。

responseType:'json' //  response 是通过将接收到的数据内容解析为 JSON 而创建的 JavaScript 对象

responseType:'text' //  response 是一个以 DOMString 对象中的文本。

responseType:'ms-stream' // response 是流式下载的一部分;此响应类型仅允许用于下载请求,并且仅受 Internet Explorer 支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值