Servlet實現文件下載


文件下載功能是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流是字符流,只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM