1.1 文件的下载概述
- 文件下载
- 服务器通过网络以流的形式将文件发送到客户端的过程
- 应用场景
- 电影下载
- 音乐下载
- 安装文件下载
- 实现方式
- 方式1
- 可以使用超链接来实现文件的下载
- <a href="要下载文件的地址" >下载</a>
- 注意:如果要下载的文件类型是浏览器支持的类型,浏览器会直接打开这个文件,并不会下载这个文件,比如图片
- 方式2
- 可以使用代码来实现文件的下载
- 需要有两个头和一个流
- Content-type 设置要下载文件的类型(MIME类型)
- Content-Disposition 通知浏览器,你不要关心下载文件的类型,什么类型的文件都进行下载操作
- 字节输出流 response.getOutputStream()
- 方式1
1.2 超链接方式实现文件下载的功能
- 好处:简单
- 缺点:
- 必须要是浏览器不能识别的格式,否则就会直接打开
- 如果资源放在web-inf路径下面,就没法获取
1.3 代码方式实现文件下载的功能
- 首先配置一下下载文件在项目中
- 编写一个下载页面
<body>
<h1>超链接实现文件下载功能</h1>
<a href="${pageContext.request.contextPath}/download/pic01.jpg" >pic01.jpg</a>
<br />
<a href="${pageContext.request.contextPath}/WEB-INF/pic01.jpg" >WEB-INF/pic01.jpg</a>
<br />
<a href="${pageContext.request.contextPath}/download/pic01.zip" >pic01.zip</a>
</body>
注意:浏览器会根据是否能解析资源来选择是显示还是下载的
WEB-INF的资源浏览器无法访问
- 使用代码实现
也需要编写一个下载页面跳转Servlet
<h1>代码方式实现文件下载的功能</h1>
<a href="${pageContext.request.contextPath}/DownloadServlet" >pic01.jpg</a>
- 编写Servlet
package com.itbear.download;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//路径
String realPath = getServletContext().getRealPath("/download");
//名称
String fileName = "pic01.jpg";
//设置两个头
String mimeType = getServletContext().getMimeType(fileName);
response.setContentType(mimeType);
response.setHeader("Content-Dispostion", "attachment;filename="+fileName);
//IO流传输
ServletOutputStream os = response.getOutputStream();
FileInputStream fis = new FileInputStream(realPath+"/"+fileName);
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1){
os.write(bys,0,len);
}
fis.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 动态获取代码
URL是可以 进行拼接 提交参数数据的
<h1>代码方式实现文件下载的功能</h1>
<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.jpg" >pic01.jpg</a>
<br />
<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.zip" >pic01.zip</a>
<br />
提交path 和 fileName
- 改写Servelt
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//路径
String path = request.getParameter("path");
String realPath = getServletContext().getRealPath("/" + path);
//名称
//String fileName = "pic01.jpg";
String fileName = request.getParameter("fileName")
//设置两个头
//设置Content-type
String mimeType = getServletContext().g-etMimeType(fileName);
response.setContentType(mimeType);
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//获取输出流
OutputStream os = response.getOutputStream();
//创建输入流
InputStream is = new FileInputStream(realPath + "/" + fileName);
byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys)) != -1) {
os.write(bys,0,len);
}
is.close();
}
- 乱码问题
<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=小熊先生.jpg" >小熊先生.jpg</a>
这样的传入中文会导致乱码
需要进行重新设置编码
String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");