SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

处理 Blob 类型文件下载问题总结

在项目中导出 Excel 文件时,曾遇到文件下载后打开显示错误或者无法正常打开的问题。经过排查,发现问题主要由以下两个方面引起:

问题描述

  1. 浏览器数据解析错误

    • 默认情况下,浏览器可能将返回的数据按文本或 JSON 格式解析,即使后端实际返回的是二进制数据。

    • 如果数据在网络传输过程中被错误解析,即使前端后续使用 new Blob 处理,也无法恢复为完整的二进制文件。

  2. HTTP 头信息设置不当

    • 未设置正确的 Content-Type,使得浏览器不知道如何正确处理返回的数据。

    • 文件下载场景中,缺少明确的 MIME 类型标识可能导致浏览器不能识别为下载文件。

关键解决方法

为了解决上述问题,采取了以下两点措施:

  1. 在请求中指定 responseType: "blob"
    这步操作确保了浏览器在接收服务器返回数据时,以二进制流(Blob)的方式处理,而不会错误地进行文本解析:

    export const exportRecord = (data: ExportRecordReq) => {
      return request<ExportRecordReq, any>({
        url: "/consumeRecord/exportRecord",
        method: "GET",
        params: data,
        responseType: "blob",  // 指示接收二进制数据,避免文本解析
        headers: {
          "Content-Type": "application/x-download"
        }
      })
    }
    • 效果: 浏览器按二进制数据接收,确保数据完整性。
  2. 设置合适的 Content-Type
    针对 Excel 文件,可以使用更精确的 MIME 类型:

    • 对于新版 Excel (.xlsx):application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

    • 对于旧版 Excel (.xls):application/vnd.ms-excel

    尽管在请求时可暂时使用 application/x-download,但在实际下载时将 Blob 对象创建为正确的 MIME 类型:

    /**
     * 导出excel数据
     */
    export function exportExcelData(filename: string, data: Blob) {
      // 使用正确的 MIME 类型创建 Blob 对象,确保浏览器识别为Excel文件
      const blob = new Blob([data], {
        type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      })
      const downloadUrl = URL.createObjectURL(blob)
      const link = document.createElement("a")
      link.href = downloadUrl
      link.download = `${filename}.xlsx`
      link.click()
    }
    • 效果: 浏览器下载的文件拥有正确的 MIME 类型,用户打开后能正常显示。

作用流程

    服务器返回二进制数据
    ↓
    responseType: "blob" (保持二进制数据的完整性)
    ↓
    Content-Type (告诉浏览器如何处理这些数据)
    ↓
    浏览器正确处理文件
  • 没有这两句:数据可能在传输或解析过程中被破坏

  • 有这两句:数据完整性得到保证,且浏览器知道如何正确处理

总结

  • 数据接收: 通过指定 responseType: "blob",确保浏览器按二进制方式接收文件数据,避免数据因文本解析而被错误转换。

  • 头信息设置: 使用正确的 Content-Type(或在前端重新定义成正确的 MIME 类型)帮助浏览器识别和处理文件。

  • 前端下载流程: 利用 new Blob 与 URL.createObjectURL() 动态生成下载链接,模拟点击下载,从而确保文件下载后能正确打开。

通过以上措施,可以有效防止由于浏览器默认解析方式不当而导致的文件损坏问题,确保导出的 Excel 文件在下载后打开正常。

最后更新时间:
贡献者: 何风顺
上一页
数据类型及引用问题
下一页
localStorage 与 sessionStorage 区别