文件下载流
Javaweb下载就是向客户端相应字节数据。原来我们响应的都是html的字符数据,下载需要把一个文件变成字节数组,使用response.getOutputStream()来响应给客户端。
下载要求
两个头一个流
> Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
* 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
> Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
* 在filename=后面跟随的是显示在下载框中的文件名称!
> 一个流:要下载的文件数据!
* 自己new一个输入流即可!
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName="G:/成绩单.jpeg";
/**
* 两个头
* content-type
* content-disposition
* 一个流:下载文件的数据
*/
//获取文件的mime类型
String contentType=request.getServletContext().getMimeType(fileName);
String contentDisposition="attachment;filename=a.jpeg";
//一个流
FileInputStream in=new FileInputStream(fileName);
response.setContentType(contentType);
response.setHeader("Content-Disposition",contentDisposition);
//获取绑定了相应端的输出流
ServletOutputStream out=response.getOutputStream();
IOUtils.copy(in,out);
in.close();//关闭输入流
out.close();//关闭输出流
}
下载文件名称编码
显示在下载框中的中文名称时,会出现乱码。
* FireFox:Base64编码。
* 其他大部分浏览器:URL编码。
有两种方案:
方案一:
filename = new String(filename.getBytes("GBK"), "ISO-8859-1");
这总方案不一定都有效(测试时谷歌、火狐、exploter11都可以,但是Microsoft Edge乱码)
方案二:(通用,推荐)
/**
* 解决下载文件的中文名称乱码
* @param filename
* @param request
* @return
* @throws IOException
*/
public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
String agent = request.getHeader("User-Agent"); //获取浏览器
if (agent.contains("Firefox")) {
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else if(agent.contains("MSIE")) {
filename = URLEncoder.encode(filename, "utf-8");
} else {
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}