首页 > 其他分享 >前端使用Fetch 后端Spring Boot实现下载文件(浏览器下载栏)

前端使用Fetch 后端Spring Boot实现下载文件(浏览器下载栏)

时间:2024-09-08 21:51:49浏览次数:11  
标签:outputStream const Spring Boot fileName new byte response 下载

前后端分别实现

前端代码

const downloadFile = () => {
    fetch("/getDocx?fileName=文件名称.docx").then((response) => {
      console.log('response :>> ', response);
      if (!response.ok) {
        throw new Error("本次请求出错!");
      }
      // 获取文件名
      const disposition = response.headers.get("Content-Disposition");
      const fileNameMatch = disposition && disposition.match(/filename=(.+)/);
      const fileName = fileNameMatch
        ? fileNameMatch[1]
        : "downloaded-file.docx";
      const resultFileName = decodeURIComponent(fileName);
      // 创建 blob 对象并下载文件
      return response.blob().then((blob) => {
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.href = url;
        a.download = resultFileName; // 设置文件名称
        a.click(); // 下载文件
        a.remove(); // 移除组件
        window.URL.revokeObjectURL(url); // 释放 blob 对象
      });
    });
  };

后端代码

@GetMapping("/getDocx")
    public ResponseEntity<byte[]> getDocx(@RequestParam String fileName) {
        // 获取模版文件
        Resource resource = new ClassPathResource(String.format("/templete/%s",fileName));
        try (InputStream inputStream = resource.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            // 返回的二进制数据
            byte[] byteArray = outputStream.toByteArray();
            // 设置浏览器识别文件请求头
            HttpHeaders headers = new HttpHeaders();
            String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+encodedFileName);
            headers.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream"); // 适用于所有二进制类型
            return new ResponseEntity<>(byteArray, headers, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseEntity<>(new byte[0], HttpStatus.NOT_FOUND);
        }
    }

如果对ResponseEntity不熟悉可以采取HttpServletResponse直接写入到响应体中

@GetMapping("/getDocx")
    public void getDocx(@RequestParam String fileName, HttpServletResponse response) {
        // 获取模版文件
        Resource resource = new ClassPathResource(String.format("/templete/%s", fileName));
        try (InputStream inputStream = resource.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
             ServletOutputStream output = response.getOutputStream()) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            // 返回的二进制数据
            byte[] byteArray = outputStream.toByteArray();
            // 设置浏览器识别文件请求头
            String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + encodedFileName);
            response.setHeader(HttpHeaders.CONTENT_TYPE, "application/octet-stream");
            output.write(byteArray);
            output.flush();
        } catch (IOException e) {
            e.printStackTrace();
            response.setStatus(HttpStatus.NOT_FOUND.value());
        }
    }

这两种方式都可以实现对文件的下载,可以随意扩展。

标签:outputStream,const,Spring,Boot,fileName,new,byte,response,下载
From: https://blog.csdn.net/weixin_62759738/article/details/142029723

相关文章

  • 基于Spring Boot构建一个点餐系统
    基于SpringBoot构建一个点餐系统是一个很好的学习机会,可以帮助你掌握如何使用SpringBoot框架来开发一个完整的Web应用程序。下面是一个简化的示例,展示了如何构建一个基本的点餐系统。1.创建SpringBoot项目首先,你需要创建一个新的SpringBoot项目。可以使用SpringInit......
  • Python ttkbootstrap学习
    HelloWorldtkinter知识记录一些tkinter库的知识。pack布局个人觉得布局其实是很负责的,因此这里对布局进行一个补充说明。pack布局是根据添加组件的顺序依次排列所有组件。pack()方法的参数有:side,fill,padx/pady,ipadx/ipady,anchor,expandside:决定组件停靠的方向......
  • 租赁|基于SpringBoot的网上租赁系统(源码+数据库+论文)
    基于SpringBoot的网上租赁系统目录一、摘要二、相关技术三、系统设计                 3.1整体功能设计图                 3.2功能具体细节设计   四、数据库设计  五、核心代码   六、论文参考 七、源码获取:一、......
  • Spring Boot实现文件上传和下载
    1.背景项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载。2.代码工程实验目标实现简单的文件上传和下载pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.......
  • Eclipse安装包下载慢解决方法
    最近开始学习Java,使用经典的EclipseIDE,结果发现下载太慢……问题分析Eclipse的下载依赖于其他镜像,(在我这里)默认为朝鲜的镜像(可能在不同电脑中默认不同):点击SelectAnotherMirror:选择中国的镜像:......
  • redis基础——SpringDataRedis入门
    redis基础——SpringDataRedis入门最近在学习redis,学到了redis的java客户端,其中最常用的是Jedis和lettuce,而SpringDataRedis是spring整合了Jedis和lettuce的产物,它提供了RedisTemplate工具类,封装各种对redis的操作,将不同数据类型的API封装到了不同类型中,避免了代码臃肿。S......
  • 网易云音乐歌单下载器
    最近要帮小朋友下载一些小学的诗词mp3,找了各种工具,还是这个好使yun-playlist-downloader:网易云音乐歌单下载器特性支持歌单/专辑/电台音质选择下载超时/重试再次下载默认跳过已下载部分,使用content-length匹配自定义文件名下载进度显示注意本项目不支持越......
  • python+flask计算机毕业设计基于单片机及spring框架的高血压患者居家监测系统(程序+开
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快和人口老龄化趋势的加剧,高血压作为一种常见的慢性疾病,其发病率逐年上升,已成为影响公众健康的重要因素之一。传......
  • Adobe Photoshop PS 2024 下载安装及常用快捷键 (图像处理软件)
    目录一、软件简介1.1产品概述1.2功能特色1.3应用领域二、安装步骤2.1准备工作下载软件:2.2安装过程三、常用快捷键3.1基础编辑快捷键3.2图像选择与裁剪3.3图层与蒙版快捷键一、软件简介1.1产品概述AdobePhotoshop(简称PS)是由AdobeSystems开发和发行......
  • Adobe Premiere Pro PR 2024 下载安装及常用快捷键 (专业视频编辑软件)
    目录一、软件概述1.1软件简介1.2主要特点1.3适用人群二、安装步骤2.1下载软件2.2安装准备2.3安装过程三、常用快捷键3.1剪辑操作3.2播放控制3.3项目管理一、软件概述1.1软件简介AdobePremierePro(简称PR)是Adobe公司开发的一款专业视频编辑软件,广泛......