小博老师解析Java核心技术点——文件下载技术

原创
2016/11/14 11:06
阅读数 98

[理论知识]

我们在软件开发工作中,会经常遇到需要提供用户下载文件的情况。下载文件一般有两种实现方式,一种是超链接方式,一种是流下载方式。本文小博老师就为大家分别演示下这两种下载文件的方式。

[步骤解读一]超链接下载方式

超链接的下载方式相对比较简单,就是设置超链接的href属性直接指向要下载的文件地址即可,比如我们新建一个jsp,提供用户下载多种文件,核心代码如下:

<body>

<a href="downloads/java.docx">Word文档(博为峰全栈Java课程)</a><br/><br/>

<a href="downloads/job.xls">Excel表格(博为峰学员就业信息表)</a><br/><br/>

<a href="downloads/atact.txt">Txt记事本(博为峰各地中心联系方式)</a><br/><br/>

<a href="downloads/bwf_logo.png">PNG图片文件(博为峰Logo图片)</a><br/><br/>

</body>

使用浏览器访问页面后,会发现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();

}

}

}

我们再打开浏览器测试,所有类型的文件都可以下载成功了。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部