[理论知识]html
咱们在软件开发工做中,会常常遇到须要提供用户下载文件的状况。下载文件通常有两种实现方式,一种是超连接方式,一种是流下载方式。本文小博老师就为你们分别演示下这两种下载文件的方式。java
[步骤解读一]超连接下载方式浏览器
超连接的下载方式相对比较简单,就是设置超连接的href属性直接指向要下载的文件地址便可,好比咱们新建一个jsp,提供用户下载多种文件,核心代码以下:app
<body>jsp
<a href="downloads/java.docx">Word文档(博为峰全栈Java课程)</a><br/><br/>测试
<a href="downloads/job.xls">Excel表格(博为峰学员就业信息表)</a><br/><br/>code
<a href="downloads/atact.txt">Txt记事本(博为峰各地中心联系方式)</a><br/><br/>htm
<a href="downloads/bwf_logo.png">PNG图片文件(博为峰Logo图片)</a><br/><br/>对象
</body>blog
使用浏览器访问页面后,会发现Word文档和Excel表格能够下载,可是Txt记事本和PNG图片点击超连接后,并不会下载,而是页面跳转过去直接在浏览器中显示Txt和图片的内容了:
形成这个现象的缘由,是由于浏览器没法直接识别.doc和.xls格式的文件,所以浏览器提供了用户直接下载文件,可是浏览器是能够直接识别.txt和.png格式的文件的,所以浏览器就会把它们当成页面直接跳转过去显示了。这也是超连接方式下载文件的最大弊端,另外插一句,超连接方式下载文件还有一个弊端,那就是提供下载的文件地址路径彻底暴露了出来,用户能够直接输入要下载的文件路径进行下载,这样就很难实现一些业务逻辑处理,好比下载前查看用户的积分是否达到了下载此文件所必要的积分,须要充值等等。
[步骤解读二]流方式下载
接下来小博老师为你们讲解第二种下载文件方式,它的核心思路是,把须要下载的文件,用输入流的方式打开而且读取文件中的数据,而后将数据输出响应给客户端浏览器,而且设置响应的头信息Content-type的值,从原来的text/html改成application/octet-stream,也就是告诉浏览器不要以text/html的方式解析响应数据了,要以输出流的方式向客户端输出响应数据,这样实现文件下载的效果。
咱们首先改变jsp文件,核心代码以下:
<body>
<a href="BWFDownload?file=java.docx">Word文档(博为峰全栈Java课程)</a><br/><br/>
<a href="BWFDownload?file=job.xls">Excel表格(博为峰学员就业信息表)</a><br/><br/>
<a href="BWFDownload?file=atact.txt">Txt记事本(博为峰各地中心联系方式)</a><br/><br/>
<a href="BWFDownload?file=bwf_logo.png">PNG图片文件(博为峰Logo图片)</a><br/><br/>
</body>
这样修改后,全部的下载任务会请求到一个映射为BWFDownload的Servlet上,而且把须要下载的文件名用GET方式传递给Servlet。接下来咱们就建立这个Servlet,核心代码以下:
@WebServlet("/BWFDownload")
public class BWFDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取Get传值 要下载的文件名称
String file = request.getParameter("file");
// 实例化 SmartUpload 对象
SmartUpload upload = new SmartUpload();
// 初始化 SmartUpload对象 的参数
upload.initialize(getServletConfig(), request, response);
// 取消默认打开方式(text/html方式) 改变为application/octet-stream方式
upload.setContentDisposition(null);
try {
// 响应输出要下载的文件中的数据
upload.downloadFile("downloads/"+file);
} catch (SmartUploadException e) {
e.printStackTrace();
}
}
}
咱们再打开浏览器测试,全部类型的文件均可如下载成功了。