標籤:
本篇接上一篇《Servlet的學習(七)》,繼續從HttpServletResponse響應對象來介紹其方法和功能。
使用setHeader方法結合HTTP協議的content-disposition回應標頭可以將某些web資源以下載方式回傳給用戶端。但是在下載中文檔案的時候會有一些問題,這問題會怎麼發生呢?
我們現在來進行從用戶端向伺服器端下載一個圖片檔案,先在MyEclipse的自建立【myservlet】web工程下準備一個圖片檔案,放置在web目錄下的【download】檔案夾中:
建立名為ServletResponse的Servlet,代碼如下:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 //1,擷取將要下載的檔案路徑和檔案名稱 5 ServletContext context = this.getServletContext(); 6 String filePath = context.getRealPath("/download/銀魂全家福.jpg"); 7 String fileName = filePath.substring(filePath.lastIndexOf("\\")+1); 8 9 //2,使用HTTP協議的Content-Disposition要求標頭告訴用戶端以下載方式接受這個資料(檔案)10 response.setHeader("content-disposition", "attachment;filename="+fileName);11 12 //3,通過流向響應對象寫資料實體,然後由響應對象提交給用戶端 13 FileInputStream fis = null;14 try{15 OutputStream out = response.getOutputStream();16 fis = new FileInputStream(filePath);17 byte[] buff = new byte[1024];18 int len = 0;19 while((len =fis.read(buff))>0) {20 out.write(buff, 0, len);21 }22 }23 finally {24 if(fis!=null) {25 fis.close();26 }27 }28 }
而這樣,當在瀏覽器中訪問該Servlet時就會出現下載請求的彈窗:
這裡就有一個問題了,下載檔案的名稱不對,如果是英文檔案名稱就不會出現這個問題,而中文檔案名稱就必須通過URL編碼:
將上述代碼中的response.setHeader("content-disposition", "attachment;filename="+fileName);
改為:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 即可。
我們重新發布該工程,然後再在瀏覽器中訪問該Servlet,看到這回的下載彈窗:
這回就可以下載了,當我們下載後就可以看到確實是伺服器上得資源:
(真棒!)
所以中文檔案下載方式要先通過URLEncoder進行編碼後再寫入相應對象中。
下面一個案例來講述用HttpServletResponse響應對象來向用戶端輸出隨機圖片(可以用作驗證碼)。
通常使用BufferedImage類來建立緩衝圖片對象,然後通過該對象建立圖片對象Graphics2D對象,用圖片對象進行文字和邊框的設定等等之後,由ImageIO對象來負責將圖片對象通過IO流傳遞給HttpServletResponse對象。
(未完待續。。。)
Servlet的學習(八)