Servlet——使用http响应头Content-Disposition下载文件的示例
2016-04-22 14:14
585 查看
项目目录如上所示,图片jpg和音乐mp3存在web应用中,而影音mp4不在web应用目录中。
首先,写了一个简单的下载页面download.html,提供下载链接,如下:
<!DOCTYPE html> <html> <head> <title>Download</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my download page"> <meta name="content-type" content="text/html; charset=gbk"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <h1>下载列表</h1> <hr> <h2>音乐</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=Avicii Conrad Sewell - Taste the Feeling.mp3">Avicii Conrad Sewell - Taste the Feeling</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Madonna - Living For Love.mp3">Madonna - Living For Love</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Sam Smith - Lay Me Down.mp3">Sam Smith - Lay Me Down</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Tanaki Alison - Reach Higher.mp3">Tanaki Alison - Reach Higher</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Tep No - Me And My Guitar.mp3">Tep No - Me And My Guitar</a></li> </ul> <hr> <h2>图片</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=cat (1).jpg">cat (1)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (2).jpg">cat (2)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (3).jpg">cat (3)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (4).jpg">cat (4)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (5).jpg">cat (5)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (6).jpg">cat (6)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (7).jpg">cat (7)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (8).jpg">cat (8)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (9).jpg">cat (9)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (10).jpg">cat (10)</a></li> </ul> <hr> <h2>影音</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=Kawhi Leonard Career Big Movie - Evolving In Silence.mp4">Kawhi Leonard Career Big Movie - Evolving In Silence</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Monkey.King.Hero.is.Back.2015.mp4">Monkey.King.Hero.is.Back.2015</a></li> </ul> </body> </html>
注意到,所有的下载链接都指向了/DownFileTest/DownFileServlet,并且后面跟着filename这个参数。
该页面运行结果如下所示:
那么,DownFileServlet.java如下所示:
package com.gavin.download; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // request通过getParameter得到filename这个参数的值 String filename = request.getParameter("filename"); System.out.println(filename); // response设置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); String path = null; // jpg和mp3都存在于web应用目录下,mp4则存在于F盘的movie文件夹下 // 如果是jpg或者mp3则通过它们的相对路径得到绝对路径 if(filename.endsWith("jpg")){ path= this.getServletContext().getRealPath("/images/"+filename); }else if (filename.endsWith("mp3")){ path= this.getServletContext().getRealPath("/musics/"+filename); }else if(filename.endsWith("mp4")){ path = "F:\\movie\\"+filename; } FileInputStream fis = new FileInputStream(path); byte buff[] = new byte[2048]; int len = 0; OutputStream os = response.getOutputStream(); while((len = fis.read(buff))>0){ os.write(buff, 0, len); } os.close(); fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }此时示例已经完成,每一次请求DownFileServlet,该Servlet都通过request得到filename这个参数的值,并判断后缀来得到资源的全路径,然后通过字节流传递给客户端。
相关文章推荐
- 2016西电校赛网络赛 Problem H 数学题
- http
- C# 抓取网页Html源码 (网络爬虫)
- 2016西电校赛网络赛 Problem G 合并模板
- AnyEvent::HTTP 介绍
- AnyEvent::HTTP 介绍
- AnyEvent::HTTP 介绍
- 聊聊同步异步、阻塞非阻塞
- Servlet——简单用户登录实例+http协议解析
- HTTP0.9 vs. HTTP1.0 vs. HTTP1.1 vs. HTTPng
- The type org.apache.http.HttpResponse cannot be resolved. It is indirectly referenced from required
- Linux网络编程入门
- web api HttpResponseMessage的简单使用
- 【转】C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- HttpClient 测试web API上传文件实例
- http请求的header body
- 解决:Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure the proxy
- 【Https】iOS 端两种Https数据传输加密方法
- 计算机网络自顶向下方法之一一一第一章 之二
- Http怎么处理长连接