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

JavaWeb案例: 文件下载 基于tomcat8 默认编码为UTF-8的更多相关文章

  1. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  2. MyEclipse默认编码为GBK,修改为UTF8的方法

    MyEclipse 默认编码居然是GBK,js文件默认编码是ISO-....怎么可以这样呢? 都修改成UTF8的方法: 1.windows->Preferences...打开"首选项& ...

  3. java_windows下修改eclipse的默认编码

    windows下修改eclipse的默认编码   windows下一般系统编码为 GB2312(中文版的windows), 由于我比较喜欢utf8格式的编码,现将修改方式和大家分享 如果要使新建立工程 ...

  4. Eclipse默认编码设置

    eclipse 默认编码居然是GBK,js文件默认编码是ISO-....怎么可以这样呢?都修改成UTF8的方法:1.windows->Preferences...打开"首选项" ...

  5. eclipse 设置 默认编码为 utf-8

    学习javaweb时,开发工具都采用utf-8的编码方式,给eclipse设置默认编码为utf-8的编码方法 菜单 Window -> preference -> General -> ...

  6. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  7. FileReader采用的默认编码

    很久以前听教学视频,里面讲到Java采用的默认编码是ISO-8859-1,一直记着. 但是最近重新看IO流的时候,惊讶地发现,在不指定字符编码的情况下,FileReader居然可以读取内容为中文的文本 ...

  8. Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制

    Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Options  1>.OPTIONS指 ...

  9. Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制

    Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基于用户的访问控制概述 认证质询: WWW-Auth ...

随机推荐

  1. git 生成patch和应用patch【转】

    本文转载自:http://www.jianshu.com/p/814fb6606734 1.在git源码目录下执行 1.1.两个commit间的修改(包含两个commit) git format-pa ...

  2. jquery 3D分页翻转滑块

    jquery 3D分页翻转滑块,jquery分页,jquery插件,jquery,3D翻转,css3分页,360度旋转,网页特效代码3D分页翻转滑块是一款使用网格样式与滑块效果分页的特效.

  3. BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230 题意: 有n盏灯,一开始全是关着的. 有m次操作(p,a,b).p为0,则将区间[a ...

  4. CentOS7 默认防火墙firewalld

    firewalld基础 firewalld是CentOS7源生支持的防火墙,firewalld最大的好处有两个:支持动态更新,不用重启服务:第二个就是加入了防火墙的“zone”概念. firewall ...

  5. mac快速正确的安装 Ruby, Rails 运行环境

    Mac OS X 任意 Linux 发行版本(Ubuntu,CentOS, Redhat, ArchLinux ...) 强烈新手使用 Ubuntu 省掉不必要的麻烦! 以下代码区域,带有 $ 打头的 ...

  6. (转)C/C++——auto,static,register,extern用法

    转自:https://blog.csdn.net/u010757264/article/details/49932829 C++中变量.函数的属性包括数据类型和存储类别.存储类别分为静态存储和动态存储 ...

  7. OpenCv-Python 图像处理基本操作

    1. 图片加载.显示和保存 import cv2 img = cv2.imread("01.jpg") imgGrey = cv2.imread("01.jpg" ...

  8. [C++11新特性]第二篇

    0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(i ...

  9. 关系逻辑运算符---------&&和||

    1.&&符号 常规用法没什么好说的,我们来说说其不同于java的特殊之处 (1)&&符号究竟返回什么 我们知道,0,null,defined,null,NaN等都可以转 ...

  10. WebP探索

    不同场景下WebP的使用方案总结:   App:Android4.0以上提供原生支持,其他版本使用官方提供的解析库(Android.iOS):   浏览器:JS能力检测,对支持 WebP 的用户输出 ...