文件导出,前后端联调实现,通过Blob

导出

基本原理

后端返给前端Excel文件作为响应发送给前端。

在这种情况下,当前端接收到这个响应时,它将是一个Blob对象。Blob对象是用来处理二进制数据的,因此在前端接收到这个响应后,可以根据需要对这个Blob对象进行进一步的操作。

Blob

Blob(Binary Large Object)表示二进制类型的大对象。在数据库管理系统中,将二进制数据存储为一个单一个体的集合。

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

后端

当我们在使用Java编写Web应用程序时,我们通常会使用Servlet来处理客户端发起的HTTP请求。

在Servlet中,response 对象代表了服务器对客户端的响应。通过response 对象,我们可以设置HTTP响应的各种属性,包括响应的内容类型、状态码、头部信息等。

在后端导出文件时设置响应头是非常重要的,因为它告诉客户端接收到的数据是什么类型的文件,以及如何处理这些数据。具体来说,设置响应头的作用包括:

  1. 指定内容类型:通过设置Content-Type响应头,可以告诉客户端接收到的数据是什么类型的文件,比如文本、图片、PDF、Excel等。这样客户端就可以根据这个信息来决定如何处理这些数据。
  2. 指定字符编码:通过设置Content-TypeCharset响应头,可以指定文件的字符编码,确保客户端能够正确地解析和显示文本数据。
  3. 提示下载:通过设置Content-Disposition响应头的attachment属性,可以提示浏览器弹出文件下载对话框,让用户保存文件。
  4. 缓存控制:通过设置Cache-ControlExpires响应头,可以控制客户端缓存文件的行为,避免重复下载相同的文件。

举例代码

java 复制代码
public void export(HttpServletResponse response, @RequestBody EvaluateTaskReportDto input) throws IOException {
    // 设置响应头
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");

    ExcelUtils.export(response, "评价任务填报错误信息", input.getErrorObject(), EvaluateTaskReportDto.class);

代码解释

  1. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - 这行代码设置了HTTP响应的内容类型为Excel文件。application/vnd.openxmlformats-officedocument.spreadsheetml.sheet是MIME类型,表示这是一种基于XML的电子表格文件格式,通常用于表示Excel文件。
  2. response.setCharacterEncoding("utf-8"); - 这行代码设置了响应的字符编码为UTF-8。这意味着在向客户端发送文本数据时,使用UTF-8编码来确保支持各种语言的字符集。

前端

当前端接收到后端的返回以后,他得到的 数据就是blob的类型的

举例代码

js 复制代码
export function errorexport(data) {
    return request({
        url: routePath+'/evaluatetaskreport/error',
        method: 'post',
        responseType: 'blob',    
        data: data  // 将参数作为请求体传递
        
    })
}

代码解释

responseType:指定了期望接收到的响应类型,这里是'blob',表示希望接收到的响应是一个Blob对象

举例代码

js 复制代码
		this.$store
            .dispatch("evaluatetaskreport/errorexport", para)
            .then((res) => {
              console.log(res)
              const data = res;
            console.log(data);
            const url = window.URL.createObjectURL(new Blob([data]), {
              type: "application/vnd.ms-excel;charset=utf-8",
            });
            const link = document.createElement("a");
            link.style.display = "none";
            link.href = url;
            let fileName = "评价任务填写错误.xlsx"
            link.setAttribute("download", fileName);
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            })
            .catch((err) => {
              console.log(err);
            });

代码解释

使用window.URL.createObjectURL创建了一个指向后端返回的 Blob 数据的 URL 对象,并创建了一个隐藏的<a>标签,将该 URL 赋给href属性。然后设置了下载属性,并将<a>标签添加到页面中进行下载。最后,完成下载后移除了<a>标签。

总结

通过blob去导出文件,后端导出文件时设置响应头是非常重要的 ,前端获取到blob数据以后,无法直接下载,需要创建后端返回的blob数据对象的URL 对象,并创建了一个隐藏的<a>标签,将该 URL 赋给href属性。然后设置了下载属性 ,并将<a>标签添加到页面中进行下载。

相关推荐
胖少年14 小时前
Vitest 5 正式发布实测:Node 22 起步、expect 内联、poll 超时会挂,3.8 亿月下载量的测试框架本周换代
javascript
神膘护体小月半14 小时前
mask 渐变遮罩属性
前端·css·css3
MacroZheng14 小时前
面试官皱眉:"你懂 Vibe Coding,那你说superpowers和grill-me怎么选?",我:"小孩才做选择,我全都要!"
java·人工智能·后端
千里码aicood14 小时前
flask-基于注意力机制的异常流量检测与自动防御系统
后端·python·flask
李迟14 小时前
Golang实践录:工程框架实践:搭建工程模板
开发语言·后端·golang
梨想橙汁14 小时前
Webpack 快速上手:前端工程化、打包原理、从零搭建基础项目
前端·webpack·前端工程化
Lynko14 小时前
C语言指针高阶
后端
the局外人14 小时前
学习 FastAPI 的 Day 2:用异步 ORM 完成增删改查
后端·python·fastapi
zhanghaha131414 小时前
HTML系列教程:12_HTML 表格 <table> 零基础详解
前端·html
Betterme15 小时前
Vue3 竞态请求防护组合式hooks:useLatestRequest 设计思路
前端