文件下載功能是web開發中經常使用到的功能,使用HttpServletResponse對象就可以實現文件的下載
文件下載功能的實現思路:
1.獲取要下載的文件的絕對路徑
2.獲取要下載的文件名
3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件
4.獲取要下載的文件輸入流
5.創建數據緩沖區
6.通過response對象獲取OutputStream流
7.將FileInputStream流寫入到buffer緩沖區
8.使用OutputStream將緩沖區的數據輸出到客戶端瀏覽器
范例:使用Response實現中文文件下載
下載中文文件時,需要注意的地方就是中文文件名要使用URLEncoder.encode方法進行編碼(URLEncoder.encode(fileName, "字符編碼")),否則會出現文件名亂碼。
1 package gacl.response.study; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.URLEncoder; 10 import javax.servlet.ServletException; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 /** 15 * @author gacl 16 * 文件下載 17 */ 18 public class ResponseDemo02 extends HttpServlet { 19 20 public void doGet(HttpServletRequest request, HttpServletResponse response) 21 throws ServletException, IOException { 22 downloadChineseFileByOutputStream(response);//下載中文文件 23 } 24 25 /** 26 * 下載中文文件,中文文件下載時,文件名要經過URL編碼,否則會出現文件名亂碼 27 * @param response 28 * @throws FileNotFoundException 29 * @throws IOException 30 */ 31 private void downloadChineseFileByOutputStream(HttpServletResponse response) 32 throws FileNotFoundException, IOException { 33 String realPath = this.getServletContext().getRealPath("/download/張家界國家森林公園.JPG");//獲取要下載的文件的絕對路徑 34 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//獲取要下載的文件名 35 //設置content-disposition響應頭控制瀏覽器以下載的形式打開文件,中文文件名要使用URLEncoder.encode方法進行編碼,否則會出現文件名亂碼 36 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 37 InputStream in = new FileInputStream(realPath);//獲取文件輸入流 38 int len = 0; 39 byte[] buffer = new byte[1024]; 40 OutputStream out = response.getOutputStream(); 41 while ((len = in.read(buffer)) > 0) { 42 out.write(buffer,0,len);//將緩沖區的數據輸出到客戶端瀏覽器 43 } 44 in.close(); 45 } 46 47 public void doPost(HttpServletRequest request, HttpServletResponse response) 48 throws ServletException, IOException { 49 doGet(request, response); 50 } 51 }
運行結果如下所示:
文件下載注意事項:編寫文件下載功能時推薦使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。

