一、文件的下载两种方式,头信息设置
1、文件的下载
* 什么是文件下载:从服务器上把文件保存到本地电脑上,这个过程称为文件的下载
* 文件下载有两种方式:
- 第一种方式:直接写超链接,在超链接里面写文件的路径
*** 存在问题,如果文件是图片格式,直接打开;如果zip格式的文件,才会提示下载。
*** 无论什么格式,都提示下载
- 第二种方式:手动写代码实现下载
*** 设置头信息 Content-Disposition,无论文件是什么格式,都以下载的方式打开
二、文件下载实现步骤
* 文件下载的代码实现步骤:
第一步,从服务器上获取到要下载的文件流(输入流)
第二步,使用输出流把文件写到浏览器
第三步,流对接
** 最重要的步骤:设置头信息 Content-Disposition,无论文件是什么格式,都以下载的方式打开
//设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+filename);
** 设置文件的MIME类型
//得到文件的mime类型
String type = getServletContext().getMimeType(filename);
//设置mime类型
response.setContentType(type);
三、下载文件存在中文解决方案
* 如果下载的文件名称包含中文,不能正常显示
-如何解决:
*** 不同的浏览器有不同的编码方式,ie浏览器采用url编码;火狐浏览器采用的base64编码
- 如何判断不同的浏览器:
*** 在请求头里面有User-Agent:获取浏览器类型
//解决中文乱码问题
//得到当前请求的浏览器的类型
String agent = request.getHeader("User-Agent");
//如果是火狐浏览器
if(agent.contains("Firefox")) {
//url采用base64编码
filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
} else {//ie浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
四、代码演示
package com.ayit.download;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
import com.ayit.bean.Info;
import com.ayit.service.InfoService;
/**
* 该类实现文件下载功能
* @author XiaYuJia
*
*/
public class Download extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//根据id查询数据库文件信息
String id = request.getParameter("id");
InfoService service = new InfoService();
Info info = service.selectInfo(id);
if(info==null){
throw new RuntimeException("文件不存在");
}else{
//获取文件信息
String realName = info.getRealName();
String uuidName = info.getUuidName();
String savePath = info.getSavePath();
//对下载的文件包含中文名称进行处理
String header = request.getHeader("User-Agent");
//如果是火狐浏览器
if(header.contains("Firefox")) {
//base64编码
realName = "=?UTF-8?B?"+
new BASE64Encoder().encode(realName.getBytes("utf-8"))+"?=";
} else {//其他浏览器
realName = URLEncoder.encode(realName,"utf-8");
}
//设置mime类型
response.setContentType(getServletContext().getMimeType(realName));
//设置下载头信息
response.setHeader("Content-Disposition", "attachement;filename="+realName);
//获取文件输入输出流
InputStream in = new FileInputStream(savePath+"/"+uuidName);
OutputStream out = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}