Servlet——使用http响应头Content-Disposition下载文件的示例

24 篇文章 15 订阅
19 篇文章 4 订阅

项目目录如上所示,图片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这个参数的值,并判断后缀来得到资源的全路径,然后通过字节流传递给客户端。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值