案例-03下载
需求分析
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
分析
在前端页面点击标签通过href进行获取链接指向的来源。
超链接指向的资源如果能够被浏览器解析,则直接在浏览器中展示
如果不能解析,则弹出下载框
弹出下载框需要设置content-disposition:
1
content-disposition:attachment;filename=xxx
步骤
定义页面,编辑超链接href属性,指向servlet,传递资源名称filename
书写servlet
- 获取文件名称
- 使用字节输入流加载文件进内存
- 指定response的响应头:
1
content-disposition:attachment;filename=xxx
4. 将数据写出到response输出流
代码
下载页面download.html
1 |
|
DownloadServlet
1 | package cn.itcast.web.servlet; |
演示
项目总结
如何实现下载?
- 前端是一个超链接a标签,href为文件来源。如果href来源是一个浏览器可以解析的文件,那么浏览器直接打开;如果href来源是一个servlet那么需要servlet对response输出流进行处理。href接受response输出流。
- servlet的编写
- 用content-disposition设置资源打开的方式
- 获取传递的参数,通过servletContext获取该文件的mime类型,再通过setContentType设置响应内容
- 获取服务器文件的路径(下载是从服务器中下载),api为servletContext.getRealPath
- 利用输入流将文件读取进内存,然后再输出到response输出流中。超链接就可以接收到流文件。剩下的工作就是浏览器进行操作。
如何获取服务器文件路径
利用servletContext对象的方法getRealPath进行获取,不同文件位置获取方法参数不一样,如下
文件在web目录下,参数路径就是文件名
1
String b = context.getRealPath("/b.txt");
文件在WEB-INF目录下,参数路径就是/WEB-INF/文件名
1
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
文件在src目录下,参数路径就是/WEB-INF/classes/文件名
1
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
content-disposition 和content-type区别
content-disposition告诉浏览器文件的打开方式,一般用附件打开采用content-disposition。
1
2response.setHeader("content-disposition","attachment;filname=111");
content-type告诉浏览器响应的类型,参数一般是mime类型,需要借助servletContext获取对应文件的mime类型。
1
response.setContentType(context.getMimeType(fileName));
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 坚韧的长线「串联」散落的珍珠!
评论