1. 程式人生 > >Servlet 實現下載功能

Servlet 實現下載功能

一個使用Servlet檔案實現檔案下載的例項(可以擴充本例項實現:對使用者隱藏他要下載檔案的路徑,或者在下載檔案時要做一些其他的工作,如檢查使用者有沒有下載此檔案的許可權等)瞭解在Servlet中如何控制輸出流以及response物件的contentType相關知識一個Servlet檔案DownloadFile,在此Servlet中讀取要下載的檔案,然後寫到響應流中以達到使用者下載檔案的目的。要下載的檔案可以放在任何地方,並且是對使用者隱藏的。在DownloadFile Servlet中,首先要得到要下載檔案的檔名filename,同時要預先定義好檔案儲存的路徑,然後設定response物件的內容型別和頭資訊,最後讀取要下載檔案的位元組流並寫到response的輸出流中。

  1. package myservlet;  
  2. import java.io.*;  
  3. import javax.servlet.*;  
  4. import javax.servlet.http.*;  
  5. publicclass DownloadFile extends HttpServlet {  
  6.  //字元編碼
  7.  privatefinal String ENCODING="GB2312";  
  8.  //內容型別
  9.  privatefinal String CONTENT_TYPE="text/html;charset=gb2312";  
  10.  //要下載的檔案存放的路徑
  11.  private String downloadfiledir=
    "d:\\temp\\";  
  12.  publicvoid doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{  
  13.  //設定request物件的字元編碼
  14.  request.setCharacterEncoding(ENCODING);  
  15.  //從request中取出要下載檔案的名字
  16.  String filename=request.getParameter("filename");  
  17.  if(filename==null||filename.trim().equals(
    "")){  
  18.  //設定response物件的ContentType
  19.  response.setContentType(CONTENT_TYPE);  
  20.  //輸出錯誤資訊
  21.  PrintWriter out=response.getWriter();  
  22.  out.println("<font color=red>輸入的檔名無效!</font>");  
  23.  out.close();  
  24.  }else{  
  25.  //下載檔案的完整路徑名
  26.  String fullfilename=downloadfiledir+filename;  
  27.  System.out.println("下載檔案:"+fullfilename);  
  28.  //根據檔案的型別設定response物件的ContentType
  29.  String contentType=getServletContext().getMimeType(fullfilename);  
  30.  if(contentType==null)  
  31.  contentType="application/octet-stream";  
  32.  response.setContentType(contentType);  
  33.  //設定response的頭資訊
  34.  response.setHeader("Content-disposition","attachment;filename=\""+filename+"\"");  
  35.  InputStream is=null;  
  36.  OutputStream os=null;  
  37.  try{  
  38.  is=new BufferedInputStream(new FileInputStream(fullfilename));  
  39.  //定義輸出位元組流
  40.  ByteArrayOutputStream baos=new ByteArrayOutputStream();  
  41.  //定義response的輸出流
  42.  os=new BufferedOutputStream(response.getOutputStream());  
  43.  //定義buffer
  44.  byte[] buffer=newbyte[4*1024]; //4k Buffer
  45.  int read=0;  
  46.  //從檔案中讀入資料並寫到輸出位元組流中
  47.  while((read=is.read(buffer))!=-1){  
  48.  baos.write(buffer,0,read);  
  49.  }  
  50.  //將輸出位元組流寫到response的輸出流中
  51.  os.write(baos.toByteArray());  
  52.  }catch(IOException e){  
  53.  e.printStackTrace();  
  54.  }finally{  
  55.  //關閉輸出位元組流和response輸出流
  56.  os.close();  
  57.  is.close();  
  58.  }  
  59.  }  
  60.  }  
  61.  publicvoid doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{  
  62.  //呼叫doGet()方法
  63.  doGet(request,response);  
  64.  }  
  65. }  
  66. 別處Copy的