文件下載方法和細節

文件下載
1.使用超鏈接下載
 缺點:當下載瀏覽器能夠識別的格式就會直接打開,比如圖片,txt等文件。
2.使用程序下載(設置兩個頭Content-Type 和Content-Disposition )
下載時要設置的頭:
(1)設置 Content-Type  有兩種方法,分別是下面 
response.addHeader("Content-Type","image/jpeg"); //用於已經知道文件MIME情況下
response.setContentType(this.getServletContext().getMimeType("文件名")); //這種清開靈是在未知文件類型的情況下 比如動態獲取某文件夾下的所有文件的時候  

(2) 設置 Content-Disposition,並且將中文文件名要進行URL編碼

response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"utf-8"));

(3)  ie6瀏覽器在URL編碼時特殊字符轉換有問題,推薦不要在超鏈接中將中文直接發給瀏覽器,而是先進行URL編碼,將編碼好的內容發給瀏覽器,從而能防止ie6自己 進行URL編碼時的錯漏,這種情況多出現在將文件路徑作爲參數傳遞。


單個下載例子,直接訪問sevlet

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

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

public class Download extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType(this.getServletContext().getMimeType("美人.jpg"));//設置mime
		response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode("美人.jpg","utf-8"));//中文加編碼
		FileInputStream fin = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
		int i = 0;
		while((i = fin.read())!=-1){
			response.getOutputStream().write(i);
		}
		fin.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
例子二  下載某個目錄下的所有文件

jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="java.io.File"%>
<%@page import="java.net.URLEncoder"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  	<%
  		Queue<File> queue = new LinkedList();
  		String path = "c://music";
  		File rootFile = new File(path);
  		queue.offer(rootFile);
  		while(queue.size()>0){
			File file = queue.poll();
			//如果是一個文件夾,遍歷這個文件夾,將子目錄加入到隊列中
			File [] fs = file.listFiles();
			for(File f : fs){
				if(f.isDirectory())queue.offer(f);
				else{
					%>
						<a href="${pageContext.request.contextPath }/servlet/DownLoadList?path=<%=URLEncoder.encode(f.getAbsolutePath(),"utf-8") %>"><%=f.getName() %></a><br>
					<%

				}
			}
  			
  		}
  	 %>
  </body>
</html>
服務端控制下載:

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

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

public class DownLoadList extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String path = request.getParameter("path");
		path = new String(path.getBytes("iso8859-1"),"utf-8");
		String fileName = path.substring(path.lastIndexOf("\\")+1);

		response.setContentType(this.getServletContext().getMimeType(fileName));
		response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"utf-8"));
		FileInputStream fin = new FileInputStream(path);
		int i = 0;
		while((i = fin.read())!=-1){
			response.getOutputStream().write(i);
		}
		fin.close();
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章