1. 程式人生 > >JavaEE(6)——檔案上傳下載

JavaEE(6)——檔案上傳下載

實驗6 檔案上傳下載 一、實驗目的

  1. 掌握通過Servlet實現檔案上傳下載功能;

  2. 重點掌握commons-fileupload.jar接收瀏覽器上傳檔案,實現上傳功能; 二、實驗注意事項

  3. 首先檔案上傳表單的資料也是被封裝到request物件中的。 request.getParameter(String)方法獲取指定的表單欄位字元內容,但檔案上傳表單已經不在是字元內容,而是位元組內容,所以失效。 這時可以使用request的getInputStream()方法獲取ServletInputStream物件,它是InputStream的子類,這個ServletInputStream物件對應整個表單的正文部分(從第一個分隔線開始,到最後),這說明需要的解析流中的資料。當然解析它是很麻煩的一件事情,而Apache已經幫我們提供瞭解析它的工具:commons-fileupload.jar。 該元件由多個類共同組成,使用該元件實現檔案上傳功能,只需要瞭解和使用其中三個類:DiskFileUpload、FileItem、FileUploadException。 使用fileupload元件的步驟如下: 建立工廠類DiskFileItemFactory物件: DiskFileItemFactory factory = new DiskFileItemFactory() 使用工廠建立解析器物件: ServletFileUpload fileUpload = new ServletFileUpload(factory) 使用解析器來解析request物件: List list = fileUpload.parseRequest(request)

  4. FileItem類,它才是最終要的結果。一個FileItem物件對應一個表單項(表單欄位)。一個表單中存在檔案欄位和普通欄位,可以使用FileItem類的isFormField()方法來判斷表單欄位是否為普通欄位,如果不是普通欄位,那麼就是檔案欄位了。 String getName():獲取檔案欄位的檔名稱; String getString():獲取欄位的內容,如果是檔案欄位,那麼獲取的是檔案內容,當然上傳的檔案必須是文字檔案; String getFieldName():獲取欄位名稱,例如:,返回的是username; String getContentType():獲取上傳的檔案的型別,例如:text/plain。 int getSize():獲取上傳檔案的大小; boolean isFormField():判斷當前表單欄位是否為普通文字欄位,如果返回false,說明是檔案欄位; InputStream getInputStream():獲取上傳檔案對應的輸入流; void write(File):把上傳的檔案儲存到指定檔案中。 三、實驗任務與步驟 實驗任務:利用Apache公司的commons-fileupload.jar接收瀏覽器上傳檔案,實現檔案上傳功能。

  5. 實驗步驟 【步驟1】 (1)將commons-fileupload.jar、commons-io.jar、cos.jar複製到WEB-INF\lib中,在磁碟上(本例為d:盤)新建資料夾upfile,上傳檔案將儲存在d:\upfile。 (2)設計一個Servlet類(FileUploadServlet.java),接收瀏覽器上傳的檔案,並儲存到伺服器指定的資料夾中。 (3)設計一個JSP頁面(fileupload.jsp),用於使用者通過瀏覽器選擇要上傳的檔案。 (4) 設計fileupload_list.jsp,用於顯示檔案上傳結果。 FileUploadServlet.java參考程式碼如下: package servlet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; public class FileUploadServlet extends HttpServlet { public FileUploadServlet() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(“text/html;charset=utf-8”); PrintWriter out = response.getWriter(); //設定儲存上傳檔案的目錄

     String uploadDir = "d:/upfile"; //檔案上傳後的儲存路徑 
     out.println("上傳檔案儲存目錄:"+uploadDir);   
     File fUploadDir = new File(uploadDir);   
     if(!fUploadDir.exists()){    
         if(!fUploadDir.mkdir()){       
               out.println("無法建立儲存目錄d:/upfile!");   
               return;
             }
        }
     if (!DiskFileUpload.isMultipartContent(request)){  
         out.println("只能處理multipart/form-data型別的資料!"); 
         return;
        }  
     DiskFileUpload fu = new DiskFileUpload(); 
     fu.setSizeMax(1024*1024*200);//最多上傳200M資料         
     fu.setSizeThreshold(1024*1024);//超過1M的資料採用臨時檔案快取 
     //fu.setRepositoryPath(...);  //設定臨時檔案儲存位置(如不設定,則採用預設位置)
     fu.setHeaderEncoding("utf-8");//設定上傳的檔案欄位的檔名所用的字符集編碼
     List fileItems = null;//建立檔案集合,用於儲存瀏覽器表單傳來的檔案
     try 
       {
     	fileItems = fu.parseRequest(request);         
       }		
       catch(FileUploadException e) 
        {
     	out.println("解析資料時出現如下問題:"); 
     	e.printStackTrace(out);
     	return;
        }       
     //下面通過迭代器逐個將集合中的檔案取出,儲存到伺服器上 
     Iterator it = fileItems.iterator(); //建立迭代器物件it
     while (it.hasNext()) 
     { 
       FileItem fitem = (FileItem) it.next(); //由迭代器取出檔案項 
       if (!fitem.isFormField())  //忽略其他不屬於檔案域的那些表單資訊  
         try{  
            String pathSrc = fitem.getName(); 
    

//檔名為空的檔案項不處理 if(pathSrc.trim().equals(""))continue; //確定最後的"“位置,以此獲取不含路徑的檔名 int start = pathSrc.lastIndexOf(’\’); //獲取不含路徑的檔名 String fileName = pathSrc.substring(start + 1); File pathDest = new File(uploadDir, fileName); //構建目標檔案物件 fitem.write(pathDest); //將檔案儲存到伺服器上 } catch (Exception e) { out.println(“儲存檔案時出現如下問題:”); e.printStackTrace(out); return; } finally //總是立即刪除儲存表單欄位內容的臨時檔案 { fitem.delete(); } } response.sendRedirect(”./fileupload/fileupload_list.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doGet(request,response); } public void init() throws ServletException { } } FileUploadServlet對應web.xml配置檔案如下:

<?xml version="1.0" encoding="UTF-8"?>

FileUploadServlet servlet.FileUploadServlet FileUploadServlet /FileUploadServlet fileupload.jsp參考程式碼如下: <%@ page language=“java”%> <%@ page contentType=“text/html;charset=utf-8”%>

檔案上傳

檔案上傳

檔案1:
檔案2:
檔案3:
fileupload_list.jsp參考程式碼如下: <%@ page contentType="text/html; charset=utf-8" import="java.io.*" %> 檔案目錄 已上傳的檔案目錄列表 <% String path = "d:/upfile"; File fl = new File(path); File filelist[] = fl.listFiles(); out.println("伺服器上上傳檔案的儲存路徑:"+path+""); for(int i=0; i < filelist.length; i++) { out.println((i+1)+":"+filelist[i].getName()+"  "); //如果是圖片檔案,可用以下語句顯示圖片。 //out.println(""); } %> 【步驟2】使用下面的URL訪問之。 http://localhost:8080/prac04_servlet_fileupload/fileupload/fileupload.jsp 將出現如圖6-1所示表單介面,在圖6-1所示介面中單擊瀏覽選擇需要上傳的檔案,單擊開始上傳,彈出圖6-2所示介面,說明檔案上傳成功。

圖6-1

圖6-2 開啟d:\upfile資料夾,檢視上傳檔案,如圖6-4所示。

圖6-4

四、思考題

  1. 瞭解和使用其中三個類:DiskFileUpload、FileItem、FileUploadException ;
  2. 結合本案例理解檔案上傳過程。 五、實驗總結 本實驗實現了:
  3. JSP頁面提交檔案資料到Servlet;
  4. Servlet將瀏覽器上傳的檔案儲存到指定資料夾;
  5. 設計JSP頁面,顯示檔案上傳結果。