您的位置:首页 > 理论基础 > 计算机网络

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这个参数的值,并判断后缀来得到资源的全路径,然后通过字节流传递给客户端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: