1. 程式人生 > >Servlet——使用http響應頭Content-Disposition下載檔案的示例

Servlet——使用http響應頭Content-Disposition下載檔案的示例

專案目錄如上所示,圖片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這個引數的值,並判斷後綴來得到資源的全路徑,然後通過位元組流傳遞給客戶端。