Response综合案例-文件下载
- (1)文件的复制
本质就是将一个文件的所有字节读出来,再复制到另一个文件中 - (2)打开网络文件
浏览器读服务器的文件,本质也是复制 - (3)下载网络文件
本质文件复制,不过通过设置响应头,控制浏览器以附件的形式下载
response-综合案例-弹出保存框
如果需要浏览器弹出保存框,则需要通过设置响应头的两个指令
- Content-Type 设置MIME-Type
- Content-Disposition 设置附件名称
//指令,调用浏览器弹出下载框,由用户自己保存
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Disposition", "attachment;filename="+saveName);
response-综合案例-getMimeType方法
- (1)如何设置附件
HTTP协议规定,如果一个服务器的文件要以附件的形式下载,必须设置两个响应头
1:下载文件的类型(MIME类型) 由下载文件的后缀名决定
tomcat服务器中的web.xml中包含大量的扩展名对应的mime-type的对应关系
比如 a.jpg 对应的mime类型是 image/jpg
getMimeType(filename) //servletContext对象的方法
2:设置一个头部信息,这个信息用来指定附件下载时,文件的名字
response-综合案例-文件名为中文
1: 如果是非中文的保存名称,浏览器可以正常保存,但如果是中文的话,需要进行先进行URL编码
美女 -----> %ED%AD%AC
2:不同的浏览器转码方式不一样: IE浏览器 火狐浏览器 其他浏览器
public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
String agent = request.getHeader("User-Agent");
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
完整下载代码
@WebServlet("/down")
public class Demo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数中的文件名
String filename=request.getParameter("filename");
String saveName=getFileName(request,filename);
//自动根据文件的后缀名得到mime-type类型
String mimeType = getServletContext().getMimeType(filename);
System.out.println(mimeType);
//指令,调用浏览器弹出下载框,由用户自己保存
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Disposition", "attachment;filename="+saveName);
//1.加载a.jpg文件成为一个输入流
InputStream inputStream = getServletContext().getResourceAsStream("download/"+filename);
//2.再使用字节流 将数据写到浏览器
OutputStream outputStream = response.getOutputStream();
//3.浏览器自动将数据显示成图片
FileService fileService = new FileService();
fileService.copy(inputStream,outputStream);
//4.关闭
outputStream.close();
inputStream.close();
}
public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
String agent = request.getHeader("User-Agent");
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}