下载时文件名乱码和文件大小未知的问题(FireFox)

编程入门 行业动态 更新时间:2024-10-12 18:18:15

下载时文件名乱码和<a href=https://www.elefans.com/category/jswz/34/1756941.html style=文件大小未知的问题(FireFox)"/>

下载时文件名乱码和文件大小未知的问题(FireFox)

文章目录

  • 下载文件时文件名乱码和文件大小未知
    • 快速解决文件名乱码
    • 快速解决文件大小未知
    • 完整项目示例
    • 参考资料

下载文件时文件名乱码和文件大小未知

这个问题引发自标准兼容问题
FireFox 对规范要求严格, 而其他浏览器相对宽容, 所以其他浏览器会兼容, 而FireFox则不做处理
解决方案是添加 Content-Disposition 响应头

快速解决文件名乱码

  • 传统 File 类型文件写法( java 1.4 ~ java 6 ):
File file = getFile();
String filename = java.URLEncoder.encode(file.getName(), "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + filename);
  • 新IO Path 类型文件写法( java 7 ~ java 13 ):
Path file = Paths.get("E:\\Downloads\\测试文件.pdf");
String filename = file.getFileName().toString();
filename = URLEncoder.encode(filename, StandardCharsets.UTF_8.displayName());
String disposition = "attachment;filename*=utf-8'zh_cn'" + filename;
response.addHeader("Content-Disposition", disposition);
  • Spring 环境下解决方案

工具类就是好用啊! org.springframework.http.ContentDisposition

String disposition = ContentDisposition.attachment().filename("测试文件.pdf", StandardCharsets.UTF_8).build().toString();
response.setHeader("Content-Disposition", disposition);

重点

重点在这一行:

 "attachment;filename*=utf-8'zh_cn'" + filename

filename*=utf-8'zh_cn' 后面直接加文件名

快速解决文件大小未知

传统IO

File file = new File("E:\\Downloads\\测试文件.pdf");
long fileSize = file .length();
response.setContentLength((int) fileSize);

新IO

Path file = Paths.get("E:\\Downloads\\测试文件.pdf");
long fileSize = Files.size(file);
response.setContentLength((int) fileSize);

重点

给 response 设置 Content-Length 头就可以解决这个问题

response.setContentLength((int) fileSize);

完整类代码

package cc.momas;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;/*** @author Sod-Momas* @since 2020.01.16**/
@WebServlet(value = "/download")
public class DownloadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 解决乱码,一般写在过滤器 filter里request.setCharacterEncoding(StandardCharsets.UTF_8.displayName());response.setCharacterEncoding(StandardCharsets.UTF_8.displayName());response.setContentType("text/html;charset=utf-8");// 获取文件Path file = Paths.get("E:\\Downloads\\测试文件.pdf");// 检测文件是否存在if (Files.notExists(file)) {response.getWriter().write("指定文件不存在:" + file.toAbsolutePath());return;}// 获取文件名String filename = file.getFileName().toString();// 获取文件大小,单位是bytelong fileSize = Files.size(file);// 将文件名URL编码filename = URLEncoder.encode(filename, StandardCharsets.UTF_8.displayName());// 添加触发下载的前缀// 规范参考 : Content-Disposition  disposition = "attachment;filename*=utf-8'zh_cn'" + filename;// 添加 Content-Disposition 告诉浏览器数据展现的方式是附件下载,并且提供文件名response.addHeader("Content-Disposition", disposition);// 添加 Content-Length 告诉浏览器数据的长度,单位是 byteresponse.setContentLength((int) fileSize);// 添加 Content-Type 告诉浏览器这是一个二进制流response.setContentType("application/octet-stream");// 把文件从本地复制到 response 输出流输出给前端Files.copy(file, response.getOutputStream());}
}

完整项目示例

请访问我的码云仓库获取最新代码:

参考资料

博客

  • http下载文件,中文文件名在firefox下乱码问题
  • Firefox下载文件时中文名乱码问题
  • 下载的附件名总乱码?你该去读一下 RFC 文档了!
  • Spring Boot 优雅的返回文件(Resource)

MDN

  • Content-Disposition Content-Disposition 响应头的作用
  • Content-Type Content-Type 实体头的作用
  • Content-Length Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。

RFC

  • Media Types 不同文件的 MIME Types
  • octet-stream - Media Type octet-stream 类型的规范

更多推荐

下载时文件名乱码和文件大小未知的问题(FireFox)

本文发布于:2024-02-06 03:02:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1745580.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件大小   乱码   文件名   FireFox

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!