首页 > 其他分享 >blob 下载文件type是否必须设置

blob 下载文件type是否必须设置

时间:2023-12-12 14:13:02浏览次数:39  
标签:const res blobType blob type 下载 row

又遇到了一件鬼打墙的事,欲哭无泪。

1

几天前,有个bug:blob文件下载,如果下载非txt文件,比如图片、xlsx,下载后的文件无法正确显示。

image

    // 下载文件
    async download(row, prop) {
      const res = await resourceDownload(row[prop.field + "fileId"]);
      // res 为 blob 类型
      const blob = new Blob([res], { type: "text/plain;charset=utf-8" });
      this.$download.saveAs(blob, row[prop.field]);
    },

于是根据文件类型设置了不同的 mime type,就可以正常显示下载的文件了。

    // 下载文件
    async download(row, prop) {
      const { id, type, name } = row[prop.field];
      switch (type) {
        case "jpg":
          this.blobType = "image/jpeg";
          break;
        case "png":
          this.blobType = "image/png";
          break;
        case "xlsx":
          this.blobType =
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
          break;
        case "txt":
          this.blobType = "text/plain;charset=utf-8";
          break;
      }
      const res = await resourceDownload(id);
      // res 为 blob 类型
      const blob = new Blob([res], {
        type: this.blobType,
      });
      this.$download.saveAs(blob, name);
    },

2

但是今天接到新需求,如果下载 json 文件,下载后还是无法正确显示。如果手动把 json 的 mime type 加上,这样每次新增其他类型的文件,就要手动修改代码,太过麻烦,需要一个一劳永逸的办法。

    // 下载文件
    async download(row, prop) {
      const { id, type, name } = row[prop.field];
      switch (type) {
	// 新增 json
	case "json":
          this.blobType = "application/json";
          break;
        case "jpg":
          this.blobType = "image/jpeg";
          break;
        case "png":
          this.blobType = "image/png";
          break;
        case "xlsx":
          this.blobType =
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
          break;
        case "txt":
          this.blobType = "text/plain;charset=utf-8";
          break;
      }
      const res = await resourceDownload(id);
      // res 为 blob 类型
      const blob = new Blob([res], {
        type: this.blobType,
      });
      this.$download.saveAs(blob, name);
    },

于是发现,对于非txt的文件可以统一设置为 application/octet-stream, txt文件设置为 text/plain;charset=utf-8

    // 下载文件
    async download(row, prop) {
      const { id, type, name } = row[prop.field];
      switch (type) {
      	case "txt":
          this.blobType = "text/plain;charset=utf-8";
          break;
        default:
          this.blobType = "application/octet-stream";
          break;
      }
      const res = await resourceDownload(id);
      // res 为 blob 类型
      const blob = new Blob([res], {
        type: this.blobType,
      });
      this.$download.saveAs(blob, name);
    },

但是测试时发现,txt 文件设置为 application/octet-stream 也能正确下载显示;甚至不设置 type 也能正确下载显示任何类型的文件。

    // 下载文件
    async download(row, prop) {
      const { id, name } = row[prop.field];
      const res = await resourceDownload(id);
      // res 为 blob 类型
      const blob = new Blob([res]);
      this.$download.saveAs(blob, name);
    },

真的是芭比Q了。陷入了鬼打墙。

我知道肯定是哪里出了问题,要么是测试时没有遵循 "同一对象原则",要么是记忆出现了混乱。

参考链接

  1. Vue 之 new Blob() 文件流下载文件不同文件类型的 type 值整理
  2. MimeType对照表 application/octet-stream

标签:const,res,blobType,blob,type,下载,row
From: https://www.cnblogs.com/shayloyuki/p/17896192.html

相关文章

  • JavaWeb——文件上传与下载
    一、文件上传简介1、文件上传的步骤(1)要有一个form表单,请求方式为post请求(因为上传的文件一般都超出长度限制)。(2)form标签的encType属性值必须为multipart/form-data。表示提交的数据,以多段的形式进行拼接,然后以二进制流的形式发送给服务器。多段:一个表单项代表一个数据......
  • HarmonyOS第二课,TypeScript语法知识
    1、TypeScript中常用的变量类型1、布尔值TypeScript中可以使用boolean来表示这个变量是布尔值,可以赋值为true或者false。letisDone:boolean=false;2、数字TypeScript里的所有数字都是浮点数,这些浮点数的类型是number。除了支持十进制,还支持二进制、八进制......
  • servlet-下载文件
    importjavax.servlet.ServletException;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.FileInputStream;importjava.io.F......
  • macOS Monterey 12.7.2 (21G1974) 正式版发布,ISO、IPSW、PKG 下载
    macOSMonterey12.7.2(21G1974)正式版发布,ISO、IPSW、PKG下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。macOSMonterey12.7.x如无特殊说明,......
  • macOS Ventura 13.6.3 (22G436) 正式版发布,ISO、IPSW、PKG 下载
    macOSVentura13.6.3(22G436)正式版发布,ISO、IPSW、PKG下载macOSVentura13.6及更新版本,如无特殊说明皆为安全更新,不再赘述。请访问原文链接:https://sysin.org/blog/macOS-Ventura/,查看最新版。原创作品,转载请保留出处。台前调度等新功能帮助Mac用户保持专注、提高生......
  • macOS Sonoma 14.2 (23C64) 正式版发布,ISO、IPSW、PKG 下载
    macOSSonoma14.2(23C64)正式版发布,ISO、IPSW、PKG下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问原文链接:https://sysin.org/blog/macO......
  • Java:实现文件的上传和下载
    1、实现文件上传功能1.配置文件:添加配置文件spring-mvc.xml,配置multipartResolver,实现文件上传和下载的功能。<!--文件上传配置--><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><propertyname="ma......
  • INFINIBAND TYPES AND SPEEDS
    Sinceitsrelease,InfiniBandhasbeenmadein5speedsandhasusedtwotypesofconnectors.FDRFDRInfiniBandprovidesa56Gbpssecondlink.ThedataencodingforFDRisdifferentfromtheotherInfiniBandspeeds:forevery66bitstransmitted64bitar......
  • typescript 参数声明,参数之前相互依赖,实例化时能明确传入参数,a参数的取值,依赖b参数的
    //声明类型exportinterfaceIform{Input:{text:string;},Select:{options:any[];},Radio:{checkd:boolean;},Switch:{checked:boolean;},}//声明函数定义函数参数key,form,form取值,校验依赖于keyexportfunctiongetF......
  • 掌握TS 从基础到深度理解,晋级TypeScript高级开发的几个实战经验
    TypeScript作为JavaScript的超集语言,在现代前端开发中扮演着重要的角色。掌握TypeScript并深入理解其高级特性,将使开发者能够更加高效地进行项目开发。本文将分享几个实战经验,帮助开发者从基础到深度理解TypeScript,并实现晋级到TypeScript高级开发的目标,并提供相关代码示例。类型注......