Servlet 實現下載功能
阿新 • • 發佈:2019-01-11
一個使用Servlet檔案實現檔案下載的例項(可以擴充本例項實現:對使用者隱藏他要下載檔案的路徑,或者在下載檔案時要做一些其他的工作,如檢查使用者有沒有下載此檔案的許可權等)瞭解在Servlet中如何控制輸出流以及response物件的contentType相關知識一個Servlet檔案DownloadFile,在此Servlet中讀取要下載的檔案,然後寫到響應流中以達到使用者下載檔案的目的。要下載的檔案可以放在任何地方,並且是對使用者隱藏的。在DownloadFile Servlet中,首先要得到要下載檔案的檔名filename,同時要預先定義好檔案儲存的路徑,然後設定response物件的內容型別和頭資訊,最後讀取要下載檔案的位元組流並寫到response的輸出流中。
- package myservlet;
- import java.io.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- publicclass DownloadFile extends HttpServlet {
- //字元編碼
- privatefinal String ENCODING="GB2312";
- //內容型別
- privatefinal String CONTENT_TYPE="text/html;charset=gb2312";
- //要下載的檔案存放的路徑
-
private String downloadfiledir=
- publicvoid doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
- //設定request物件的字元編碼
- request.setCharacterEncoding(ENCODING);
- //從request中取出要下載檔案的名字
- String filename=request.getParameter("filename");
-
if(filename==null||filename.trim().equals(
- //設定response物件的ContentType
- response.setContentType(CONTENT_TYPE);
- //輸出錯誤資訊
- PrintWriter out=response.getWriter();
- out.println("<font color=red>輸入的檔名無效!</font>");
- out.close();
- }else{
- //下載檔案的完整路徑名
- String fullfilename=downloadfiledir+filename;
- System.out.println("下載檔案:"+fullfilename);
- //根據檔案的型別設定response物件的ContentType
- String contentType=getServletContext().getMimeType(fullfilename);
- if(contentType==null)
- contentType="application/octet-stream";
- response.setContentType(contentType);
- //設定response的頭資訊
- response.setHeader("Content-disposition","attachment;filename=\""+filename+"\"");
- InputStream is=null;
- OutputStream os=null;
- try{
- is=new BufferedInputStream(new FileInputStream(fullfilename));
- //定義輸出位元組流
- ByteArrayOutputStream baos=new ByteArrayOutputStream();
- //定義response的輸出流
- os=new BufferedOutputStream(response.getOutputStream());
- //定義buffer
- byte[] buffer=newbyte[4*1024]; //4k Buffer
- int read=0;
- //從檔案中讀入資料並寫到輸出位元組流中
- while((read=is.read(buffer))!=-1){
- baos.write(buffer,0,read);
- }
- //將輸出位元組流寫到response的輸出流中
- os.write(baos.toByteArray());
- }catch(IOException e){
- e.printStackTrace();
- }finally{
- //關閉輸出位元組流和response輸出流
- os.close();
- is.close();
- }
- }
- }
- publicvoid doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
- //呼叫doGet()方法
- doGet(request,response);
- }
- }
- 別處Copy的