JavaEE(6)——檔案上傳下載
實驗6 檔案上傳下載 一、實驗目的
-
掌握通過Servlet實現檔案上傳下載功能;
-
重點掌握commons-fileupload.jar接收瀏覽器上傳檔案,實現上傳功能; 二、實驗注意事項
-
首先檔案上傳表單的資料也是被封裝到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)
-
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接收瀏覽器上傳檔案,實現檔案上傳功能。
-
實驗步驟 【步驟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: |
圖6-1
圖6-2 開啟d:\upfile資料夾,檢視上傳檔案,如圖6-4所示。
圖6-4
四、思考題
- 瞭解和使用其中三個類:DiskFileUpload、FileItem、FileUploadException ;
- 結合本案例理解檔案上傳過程。 五、實驗總結 本實驗實現了:
- JSP頁面提交檔案資料到Servlet;
- Servlet將瀏覽器上傳的檔案儲存到指定資料夾;
- 設計JSP頁面,顯示檔案上傳結果。