其实这个问题并不困难,只是下一篇会发文件上传问题,作为对照,我想把这个文件下载的分析记录下来,作为以后的回看。
一、文件下载需求
页面显示超链接
点击超链接后弹出下载提示框
完成图片文件下载
二、问题分析
超链接指向的资源如果能被浏览器解析,则会在浏览器中展示;如果不能解析,则弹出下载提示框。这不符合需求,因为文字和图片会被浏览器解析
任何资源都必须弹出下载提示框
使用响应头设置资源的打开方式:
content-disposition: attachment;filename=xxxx.xxx
三、步骤
定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
定义Servlet
获取文件名称
使用字节输入流加载文件进内存
指定response的响应头:
将数据写出到response输出流
content-disposition: attachment;filename=xxxx.xxx
四、新问题
中文文件名问题:
解决思路:
获取客户端使用的浏览器版本信息
根据不同的版本信息,设置filename的编码格式不同
代码实现:
HTML:
<a href="/day15/downloadServlet?filename=九尾.jpg">图片1</a><a href="/day15/downloadServlet?filename=1.avi">视频</a>
Servlet:
@WebServlet("/downloadServlet")public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取请求参数,文件名称String filename = request.getParameter("filename");//2.使用字节输入流加载文件进内存//2.1找到文件服务器路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2用字节流关联FileInputStream fis = new FileInputStream(realPath);//3.设置response的响应头//3.1设置响应头类型:content-typeString mimeType = servletContext.getMimeType(filename);//获取文件的mime类型response.setHeader("content-type",mimeType);//3.2设置响应头打开方式:content-disposition//解决中文文件名问题//1.获取user-agent请求头、String agent = request.getHeader("user-agent");//2.使用工具类方法编码文件名即可filename = DownLoadUtils.getFileName(agent, filename);response.setHeader("content-disposition","attachment;filename="+filename);//4.将输入流的数据写出到输出流中ServletOutputStream sos = response.getOutputStream();byte[] buff = new byte[1024 * 8];int len = 0;while((len = fis.read(buff)) != -1){sos.write(buff,0,len);}fis.close();//输出流可以关闭,也可以不关闭//如果不关闭,那么tomcat会在响应的时候帮你关闭}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}
文件下载案例完成!
实际上并不困难,仅仅是对输入输出流的操作

画师未知
文章转载自半猫Coder,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




