1. 程式人生 > >檔案的下載

檔案的下載

 

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<a href="upload.jsp">檔案的上傳</a>
	<br>
	<br>
	
	<a href="download.jsp">檔案的下載</a>
	
</body>
</html>
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- 靜態下載 -->
	<a href="xyz.txt">download xyz.txt</a>
	
	<br>
	<br>
	
	<a href="test.jsp">download test.jsp</a>
	
	<br>
	<br>
	
	<a href="downloadServlet">DownLoad abcd.pptx</a>
	
</body>
</html>

 

test.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<% 
		//1. 通知客戶端瀏覽器: 這是一個需要下載的檔案, 不能再按普通的 html 的方式開啟.
		//即設定一個響應的型別: application/x-msdownload
		response.setContentType("application/x-msdownload"); 
	
		//2. 通知客戶端瀏覽器: 不再有瀏覽器來處理該檔案, 而是交由使用者自行處理
		//設定使用者處理的方式: 響應頭: Content-Disposition
		response.setHeader("Content-Disposition", "attachment;filename=abc.txt");
	%>
	
	<h4>Test Page</h4>
	
	Time: <%= new Date() %>
	
</body>
</html>

 

package com.atguigu.download.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DownloadServlet
 */
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("application/x-msdownload"); 
		
		String fileName = "檔案下載.pptx";
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
		
		OutputStream out = response.getOutputStream();
          //注意字尾
		String pptFileName = "C:\\Users\\Think Pad\\Desktop\\電商1.docx";
		
		InputStream in = new FileInputStream(pptFileName);
		
		byte [] buffer = new byte[1024];
		int len = 0;
		
		while((len = in.read(buffer)) != -1){
			out.write(buffer, 0, len);
		}
		
		in.close();
	}

}
1)Content-Type的作用  
該實體頭的作用是讓伺服器告訴瀏覽器它傳送的資料屬於什麼檔案型別。  
例如:當Content-Type 的值設定為text/html和text/plain時,前者會讓瀏覽器把接收到的實體內容以HTML格式解析,後者會讓瀏覽器以普通文字解析.  
(2)Content-Disposition 的作用  
當Content-Type 的型別為要下載的型別時 , 這個資訊頭會告訴瀏覽器這個檔案的名字和型別。  
在講解這個內容時,張老師同時講出瞭解決中文檔名亂碼的解決方法,平常想的是使用getBytes() , 實際上應使用email的附件名編碼方法對檔名進行編碼,但IE不支援這種作法(其它瀏覽器支援) , 使用javax.mail.internet.*包的MimeUtility.encodeWord("中文.txt")的方法進行編碼。  
Content-Disposition擴充套件頭的例子:  
<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>  
<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date())  
%>  
<%  
               response.setHeader("Content-Type","video/x-msvideo");  
               response.setHeader("Content-Disposition", "attachment;filename=aaa.doc");  
%>  
Content-Disposition中指定的型別是檔案的副檔名,並且彈出的下載對話方塊中的檔案型別圖片是按照檔案的副檔名顯示的,點儲存後,檔案以filename的值命名,儲存型別以Content中設定的為準。  
注意:在設定Content-Disposition頭欄位之前,一定要設定Content-Type頭欄位。  

---------------------