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

最新文章

  1. C#pdf 切割成图片
  2. 初学Hibernate
  3. Mybatis动态SQL
  4. comparing-html5-mobile-ui-frameworks
  5. VPN ,Bypass the FIrewall
  6. iOS NSDecimalNumber 货币计算 四舍五入
  7. Linux.根据进程名关键字杀进程
  8. Java开发笔记(二十六)方法的输出参数
  9. jQuery的版本兼容问题
  10. vue bug & data type bug
  11. php 连接redis服务器
  12. oracle 存储过程分页
  13. 浅谈Vue.use
  14. ip2Long 代码
  15. web service 框架
  16. C# 简单线程实例
  17. 【iCore4 双核心板_ARM】例程二十:LWIP_TCP_CLIENT实验——以太网数据传输
  18. Linux系统文件压缩与备份(5)
  19. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串
  20. bzoj 1492

热门文章

  1. eclipse(myeclipse) author的默认名字
  2. 批量导入oracle 的sql脚本
  3. HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
  4. blog真正的首页
  5. vim 编辑器IDE版
  6. CentOS 性能监控之nmon
  7. Swift协议
  8. ACM学习历程—HDU5418 Victor and World(动态规划 && 状压)
  9. WCF的用户名+密码认证方式(转)
  10. 发个IOCP的C++例子