当前位置:   article > 正文

在Vue中利用Blob对象实现下载文件的超详细教程_vue blob

vue blob

知识点1:Blob(Binary Large Object): 二进制大数据对象

注意:如果下载文件是文本类型的(如: .txt, .js之类的), 那么用responseType: 'text'也可以, 但是如果下载的文件是图片, 视频之类的, 就得用arraybuffer或blob,更多详情请查看MDN

知识点2:从Blob中读取内容的方法我采用的是使用 FileReader。以下代码将 Blob 的内容作为类型数组读取:

知识点3:这里采用的是a标签来打开下载页面,其实通过a标签下载的方式,同window.open()是一样的,唯一的优点是可以自定义下载后的文件名,a标签里有download属性可以自定义文件名

方法一:

  • 发请求获取到文件数据
  • new FileReader()解析获取到的数据,JSON.Parse查看是否可反序列化
  • 无法反序列化代表是blob格式数据,随即建立a标签实现在页面download
  1. uploadFile () {
  2. $http
  3. request({
  4. url: "/bondParser/api/getParser",
  5. method: "post",
  6. headers: { "Content-Type": "application/x-www-form-urlencoded" },
  7. responseType: "blob",
  8. })
  9. .then(res => {
  10. //读取文件
  11. // 1.创建 FileReader 对象
  12. const fileReader = new FileReader()
  13. // 2.开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。
  14. fileReader.readAsText(res.data) // 3.以字符串的形式读取出来
  15. fileReader.onload = () => {
  16. // 4.该事件在读取操作完成时触发。注意:此时this指向fileReader
  17. let result = JSON.parse(this.result) //获取的结果根据后端返回的数据类型选用json.parse
  18. if (result.code !== 0) {
  19. //如果读取失败进行响应的操作或提示
  20. return this.$message.error('文件读取失败')
  21. }
  22. }
  23. //导出文件
  24. // 通过a标签打开新页面下载文件
  25. const a = document.createElement('a')
  26. // 构造一个blob对象来处理数据
  27. const blob = new Blob[res.data]
  28. if (res.headers['content-disposition']) {
  29. // 拿到用户上传的文件名
  30. let fileName = res.headers['content-dispositon'].splice('filename=')[1]
  31. fileName = decodeURI(encodeURI(fileName))
  32. // URL.createObjectURL()会产生一个url字符串,可以像使用普通 URL 那样使用它,比如用在 img.src 上
  33. a.href = URL.createObjectURL(blob)
  34. // a标签里有download属性可以自定义文件名
  35. a.setAttribute(
  36. 'download',
  37. fileName
  38. )
  39. document.body.appendChild(a)
  40. a.click();
  41. document.body.removeChild(a)
  42. }
  43. })
  44. }

 方法二:

  • 发请求获取数据
  • 使用数据的.text()方法并JSON.parse返序列化查看是否为blob格式数据
  • 验证为blob后借助file-saver插件的saveAS方法下载对应格式文件
  1. import { saveAs } from "file-saver";
  2. uploadFile () {
  3. $http
  4. request({
  5. url: "/bondParser/api/getParser",
  6. method: "post",
  7. headers: { "Content-Type": "application/x-www-form-urlencoded" },
  8. responseType: "blob",
  9. })
  10. .then(async (res) => {
  11. const text = await res.data.text();
  12. try {
  13. const errMsg = JSON.parse(text).message || "文件读取失败!";
  14. this.$message.error(errMsg);
  15. } catch {
  16. const fileName = res.headers["content-disposition"]
  17. .split(";")[2]
  18. .split("''")[1];
  19. saveAs(new Blob([res.data]), fileName);
  20. }
  21. })
  22. .catch(() => {
  23. this.$message.error("下载文件出现错误,请联系管理员!");
  24. })
  25. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/145254
推荐阅读
相关标签
  

闽ICP备14008679号