ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ajax 下载文件 文件被损坏

2020-06-14 10:02:26  阅读:370  来源: 互联网

标签:文件 DOMString responseType 损坏 Ajax href blob 解析 response


问题表现

Ajax 下载文件成功后,打开提示格式损坏,源代码如下:

  axios({
    method: 'get',
    url: "/public/工作簿1.xlsx", // 静态资源地址
  }).then(res => {
    const href = document.querySelector('.href')
    let blob = new Blob([res.data], { type: 'application/octet-stream'})
    href.href = URL.createObjectURL(blob)
    href.download = "xxx.xlsx"
    href.click()
  })

提示格式被损坏:

将 responseType 设置未 blob 或者 arraybuffer 即可:

  axios({
    method: 'get',
    url: "/public/工作簿1.xlsx", // 静态资源地址
    responseType: 'blob'
  }).then(res => {
    const href = document.querySelector('.href')
    let blob = new Blob([res.data], { type: 'application/octet-stream'})
    href.href = URL.createObjectURL(blob)
    href.download = "xxx.xlsx"
    href.click()
  })

原因探索

responseType 的作用用于告诉浏览器,如何解析服务端返回的数据,需要保证客户端所设置的 responseType,能够解析服务端返回的内容类型( content-type),否则会导致格式解析错误,先看 responseType 所支持的类型:

类型 说明
"" responseType 为空字符串时,采用默认类型 DOMString,与设置为 text 相同
"arraybuffer" response 是一个包含二进制数据的 JavaScript ArrayBuffer
"blob" response 是一个包含二进制数据的 Blob 对象
"document" response 是一个 HTML Document 或 XML XMLDocument,这取决于接收到的数据的 MIME 类型。
"json" response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的。
"text" response 是一个以 DOMString(UTF-16字符串) 对象表示的文本

当后台返回的数据是二进制数据流时,我们必须指定客户端也是以二进制流的方式去解析,否则无法获取到期望的结果。在上面的例子中,我们未设置 responseType,所以默认的解析方式为 DOMString,导致数据不一致。

附录

DOMString

DOMString 是一个UTF-16字符串。由于JavaScript已经使用了这样的字符串,所以DOMString 直接映射到 一个String,将 null传递给接受DOMString的方法或参数时通常会把其 stringifies 为“null”。

标签:文件,DOMString,responseType,损坏,Ajax,href,blob,解析,response
来源: https://www.cnblogs.com/GManba/p/13123766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有