下面是springmvc中下载中文文件名称为下划线的解决方案的基本步骤:
-
在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编码容易出现乱码。 -
配置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”。
- 在src/main/resources下创建文件夹file,并在里面新增文件“测试文件.txt”。
- 编写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编码。
- 访问http://localhost:8080/download,浏览器会自动弹出文件下载对话框,文件名显示为“测试文件.txt”。
示例2:文件名包含空格和特殊符号
在以下示例中,我们将在Controller中返回一个文件,文件名为“test download file.txt”。
- 在src/main/resources下创建文件夹file,并在里面新增文件“test download file.txt”。如果需要包含空格,需要用%20进行url转义。
- 编写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编码。
- 访问http://localhost:8080/download,浏览器会自动弹出文件下载对话框,文件名显示为“test download file.txt”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc中下载中文文件名称为下划线的解决方案 - Python技术站