下载文件
- 直接使用a标签来去下载
有些内容会浏览器自动解析,浏览器不能解析的文件才会被下载,不采用这种方法。
- 通过发送Servlet请求来去下载
通过发送一个Servlet请求,把文件名发送给服务器,发送给服务器后,接收到文件名参数,获取文件的绝对地址,通过流的形式来去写到浏览器。
还得要告诉文件是什么类型,浏览器是以MIME的类型来识别类型。
this.getServletContext().getMimeType(“文件名称”);
设置响应头的类型(MIME)
response.setContentType("MIME类型")
//即
response.setContentType(this.getServletContext().getMimeType(“文件名称”));
设置响应头,告诉浏览器不要去解析,是以附件的形式打开
response.setHeader("Content-Dsiposition","attachment;filename="+文件名)
步骤
1.接收文件名参数
2.获取mime类型
3.设置浏览器响应类型
4.告诉浏览器以附件形式下载
5.获取文件的绝对路径
6.读取文件流
7.获取输出流
8.把内容写出到输出流
文件路径:
jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/Servlet6?filename=1.jpg">1.jpg</a><br/>
<a href="/Servlet6?filename=a.txt">a.txt下载</a>
</body>
</html>
@WebServlet("/Servlet6")
public class Servlet6 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收文件名参数
String filename = request.getParameter("filename");
/* 对接收的参数进行编码处理
* 获取参数,默认会对参数进行编码ISO8859-1
* 把乱码转成二进制位*/
byte[] bytes = filename.getBytes("ISO8859-1");
/*使用UTF-8进行编码*/
filename = new String(bytes,"UTF-8");
/*根据文件名来获取mime类型*/
String mime = this.getServletContext().getMimeType(filename);
/*设置mimeType*/
response.setContentType(mime);
/*告诉浏览器中文编码*/
// 获取客户端信息
String agent = request.getHeader("User-Agent");
// 定义一个变量记录编码之后的名字
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE编码
filenameEncoder = URLEncoder.encode(filename, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐编码
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 浏览器编码
filenameEncoder = URLEncoder.encode(filename, "utf-8");
}
response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
//获取文件的绝对路径
String path = this.getServletContext().getRealPath("img/"+filename);
System.out.println(path);
//3.读取文件流
FileInputStream in = new FileInputStream(path);
//4.获取输出流
ServletOutputStream out = response.getOutputStream();
//5.把内容写出到输出流
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
}
}