JavaWeb案例: 文件下载 基于tomcat8 默认编码为UTF-8
2024-09-08 11:28:01
package cn.itcast.download; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException; @WebServlet("/001")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取资源名
String filename = request.getParameter("filename");
//获取资源对应输入流
FileInputStream fis = new FileInputStream(request.getServletContext().getRealPath("/download/" + filename));
//告知类型
response.setContentType(request.getServletContext().getMimeType(filename));
//告知下载
response.setHeader("content-disposition", "attachment;filename=" + filename);
//获取响应输出流
ServletOutputStream sos = response.getOutputStream();
//写数据
byte[] bys = new byte[1024 * 8];
int len;
while((len = fis.read(bys)) != -1){
sos.write(bys, 0, len);
}
//释放资源
fis.close();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
版本1 直接写逻辑,不考虑乱码
package cn.itcast.download; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Base64; @WebServlet("/download")
public class DownloadServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取资源名
String filename = request.getParameter("filename");
//获取资源对应输入流
FileInputStream fis = new FileInputStream(request.getServletContext().getRealPath("/download/" + filename));
//告知类型
response.setContentType(request.getServletContext().getMimeType(filename));
//告知下载
//处理响应头乱码,浏览器兼容性问题
String agent = request.getHeader("user-agent");
String fileNameEnc = null;
if(agent.contains("MSIE")){
fileNameEnc = URLEncoder.encode(filename,"UTF-8").replace("+", " ");
}else if(agent.contains("Firefox")){
fileNameEnc = "=?utf-8?B?"
+ Base64.getEncoder().encodeToString(filename.getBytes("UTF-8"))
+ "?=";
}else{
fileNameEnc = URLEncoder.encode(filename,"UTF-8");
}
response.setHeader("content-disposition", "attachment;filename=" + fileNameEnc);
//获取响应输出流
ServletOutputStream sos = response.getOutputStream();
//写数据
byte[] bys = new byte[1024 * 8];
int len;
while((len = fis.read(bys)) != -1){
sos.write(bys, 0, len);
}
//释放资源
fis.close();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
版本2 解决响应头乱码。content-disposition:attachment;filename=xxx
最新文章
- C#pdf 切割成图片
- 初学Hibernate
- Mybatis动态SQL
- comparing-html5-mobile-ui-frameworks
- VPN ,Bypass the FIrewall
- iOS NSDecimalNumber 货币计算 四舍五入
- Linux.根据进程名关键字杀进程
- Java开发笔记(二十六)方法的输出参数
- jQuery的版本兼容问题
- vue bug &; data type bug
- php 连接redis服务器
- oracle 存储过程分页
- 浅谈Vue.use
- ip2Long 代码
- web service 框架
- C# 简单线程实例
- 【iCore4 双核心板_ARM】例程二十:LWIP_TCP_CLIENT实验——以太网数据传输
- Linux系统文件压缩与备份(5)
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串
- bzoj 1492