暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Java笔记】Web中的文件下载问题

半猫Coder 2021-04-13
1226


其实这个问题并不困难,只是下一篇会发文件上传问题,作为对照,我想把这个文件下载的分析记录下来,作为以后的回看。




一、文件下载需求


  1. 页面显示超链接

  2. 点击超链接后弹出下载提示框

  3. 完成图片文件下载




二、问题分析


  1. 超链接指向的资源如果能被浏览器解析,则会在浏览器中展示;如果不能解析,则弹出下载提示框。这不符合需求,因为文字和图片会被浏览器解析

  2. 任何资源都必须弹出下载提示框

  3. 使用响应头设置资源的打开方式:

  4.     content-disposition: attachment;filename=xxxx.xxx




三、步骤


  1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

  2. 定义Servlet

    1. 获取文件名称

    2. 使用字节输入流加载文件进内存

    3. 指定response的响应头:

    4.     content-disposition: attachment;filename=xxxx.xxx

    5. 将数据写出到response输出流




四、新问题


中文文件名问题:

解决思路:

  1. 获取客户端使用的浏览器版本信息

  2. 根据不同的版本信息,设置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-type
String 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论