springmvc中下载中文文件名称为下划线的解决方案

下面是springmvc中下载中文文件名称为下划线的解决方案的基本步骤:

  1. 在Controller中获取文件
    @GetMapping("/download")
    public ResponseEntity<ByteArrayResource> downloadFile(HttpServletRequest request) throws IOException {
    // 获取文件路径
    String path = request.getSession().getServletContext().getRealPath("/file/测试文件.txt");
    // 读取文件
    File file = new File(path);
    FileInputStream fis = new FileInputStream(file);
    byte[] data = new byte[(int) file.length()];
    fis.read(data);
    fis.close();
    // 设置文件名
    String fileName = new String("测试文件.txt".getBytes("UTF-8"), "ISO-8859-1");
    // 返回文件流
    ByteArrayResource resource = new ByteArrayResource(data);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Disposition", "attachment;filename=" + fileName);
    return ResponseEntity.ok().headers(headers).contentLength(file.length())
    .contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
    }

    其中,设置文件名需要注意编码转换,将中文文件名从UTF-8编码转换为ISO-8859-1编码。这是由于浏览器默认使用ISO-8859-1编码,而中文文件名使用UTF-8编码容易出现乱码。

  2. 配置springmvc.xml文件
    在springmvc.xml文件中配置编码字符集过滤器,用于将请求的参数进行编码转换。

<bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
<property name="encoding" value="UTF-8" />
<property name="forceEncoding" value="true" />
</bean>

以下是两个示例:

示例1:文件名为中文

在以下示例中,我们将在Controller中返回一个文件,文件名为“测试文件.txt”。

  1. 在src/main/resources下创建文件夹file,并在里面新增文件“测试文件.txt”。
  2. 编写Controller代码:

@GetMapping("/download")
public ResponseEntity<ByteArrayResource> downloadFile(HttpServletRequest request) throws IOException {
// 获取文件路径
String path = request.getSession().getServletContext().getRealPath("/file/测试文件.txt");
// 读取文件
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
// 设置文件名
String fileName = new String("测试文件.txt".getBytes("UTF-8"), "ISO-8859-1");
// 返回文件流
ByteArrayResource resource = new ByteArrayResource(data);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=" + fileName);
return ResponseEntity.ok().headers(headers).contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
}

在以上代码中,设置文件名需要注意编码转换,将中文文件名从UTF-8编码转换为ISO-8859-1编码。

  1. 访问http://localhost:8080/download,浏览器会自动弹出文件下载对话框,文件名显示为“测试文件.txt”。

示例2:文件名包含空格和特殊符号

在以下示例中,我们将在Controller中返回一个文件,文件名为“test download file.txt”。

  1. 在src/main/resources下创建文件夹file,并在里面新增文件“test download file.txt”。如果需要包含空格,需要用%20进行url转义。
  2. 编写Controller代码:

@GetMapping("/download")
public ResponseEntity<ByteArrayResource> downloadFile(HttpServletRequest request) throws IOException {
// 获取文件路径
String path = request.getSession().getServletContext().getRealPath("/file/test%20download%20file.txt");
// 读取文件
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
// 设置文件名
String fileName = new String("test download file.txt".getBytes("UTF-8"), "ISO-8859-1");
// 返回文件流
ByteArrayResource resource = new ByteArrayResource(data);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=" + fileName);
return ResponseEntity.ok().headers(headers).contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
}

在以上代码中,我们需要对含有空格的文件名进行转义解析。同时,需要注意设置文件名的编码格式,将UTF-8编码转换为ISO-8859-1编码。

  1. 访问http://localhost:8080/download,浏览器会自动弹出文件下载对话框,文件名显示为“test download file.txt”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc中下载中文文件名称为下划线的解决方案 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Java编译优化之循环展开和粗化锁

    详解Java编译优化之循环展开和粗化锁 在Java程序的运行过程中,编译器可以通过一些技术来对代码进行优化,以提高程序的效率。其中,循环展开和粗化锁是两种常见的编译优化技术。 循环展开 循环展开是指将循环语句中的代码直接复制到循环外执行,以减少循环的迭代次数,从而提高程序的效率。循环展开可以减少循环控制器的操作,减少循环的开销,并可以利用指令级并行性。但是,…

    Java 2023年5月26日
    00
  • JDBC链接数据库的几个步骤

    JDBC 是Java Database Connectivity的缩写,意为Java数据库连通性,是Java语言中访问数据库的一种技术。以下是JDBC链接数据库的几个步骤以及示例: 步骤一:加载数据库驱动 在Java程序中要想使用某个数据库的API,就必须先装载这个数据库的驱动程序。 try { // 加载MySQL驱动 Class.forName(&quo…

    Java 2023年5月20日
    00
  • java基于AspectJ(面向切面编程)编码示例分享

    下面我将简要介绍一下关于“Java基于AspectJ编码示例分享”的完整攻略。 了解AspectJ AspectJ是一种基于Java语言的AOP(面向切面编程)框架,它提供了完整的Java编程语言中AOP的支持,可以独立使用,也可以与Spring框架相结合使用。 AspectJ有自己的语法规则和关键字,其中最重要的关键字就是@Aspect。用@Aspect注…

    Java 2023年5月20日
    00
  • JAVA实现链表面试题

    下面是“JAVA实现链表面试题”的完整攻略: 什么是链表? 链表是一种常见的数据结构,由若干个节点(Node)组成的一个序列。每个节点包含两个信息:数据(Data)和指向下一个节点的地址(Next)。 怎样用JAVA实现链表? 1. 定义节点类 public class Node { public int data; // 节点中存放的数据 public N…

    Java 2023年5月26日
    00
  • Java IO流 File类的常用API实例

    Java IO流 File类的常用API实例攻略 1. 什么是Java IO流 File类? Java IO流是Java核心API中的一部分,它提供了一种在Java应用程序中进行输入和输出操作的方式。File类是Java IO流中的重要类,它用于封装文件或目录的访问操作,提供了一系列对于文件或目录进行操作的方法。 2. File类的常用方法 2.1 File…

    Java 2023年5月19日
    00
  • Spring数据访问模板化方法

    Spring数据访问模板化方法是Spring框架提供的用于简化数据访问的一种方式。它通过封装了底层数据访问API的细节,提供了一些常用的数据访问方法供我们使用。这样我们就可以更加方便地进行数据访问,同时不需要太关心数据访问的底层细节。 Spring数据访问模板化方法主要包括JdbcTemplate、NamedParameterJdbcTemplate和Sim…

    Java 2023年5月20日
    00
  • IDEA2020.1创建springboot项目(国内脚手架)安装lombok

    这里是创建Spring Boot项目并安装Lombok的完整攻略。 准备工作 在开始之前,需要先确保已经在电脑上安装好以下软件:- JDK(Java开发工具包)- IntelliJ IDEA 2020.1(社区版或旗舰版均可) 创建Spring Boot项目 打开 IntelliJ IDEA,选择 “Create New Project” 创建新项目。 在左…

    Java 2023年5月19日
    00
  • Redis介绍和使用场景详解

    Redis介绍和使用场景详解 什么是Redis Redis是一种高性能的内存数据库,其发展史可以追溯到2009年。Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合,同时还支持事务、持久化和复制等功能。Redis作为一个内存数据库,它的读写速度非常快,被广泛应用在数据缓存、消息队列、计数器等场景中。 Redis的使用场景 缓存 Redis最…

    Java 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部