1. 程式人生 > >Apache Commons FileUpload實現檔案上傳

Apache Commons FileUpload實現檔案上傳

Commons FileUpload簡介

Apache Commons是一個專注於可重用Java元件開發的 Apache 專案。Apache Commons專案由三個部分組成:

1、Commons Proper - 可重用Java元件的儲存庫。

2、The Commons Sandbox - 用於Java元件開發的工作區。

3、The Commons Dormant - 當前不活動的元件儲存庫。

Commons-FileUpload是Commons Proper中的一個元件,該元件依賴於Commons-IO ,Commons-IO也是 Commons Proper中的一個元件。

Commons FileUpload 的JAR包下載

Commons IO 的JAR包下載

前端檔案上傳頁面

檔案上傳注意事項

FileUpload能解析符合HTML中基於表單的檔案上載的HTTP請求 。也就是說,如果使用POST方法提交HTTP請求,並且內容型別為“multipart / form-data”,則FileUpload可以解析該請求,並使結果易於使用。

1、只能使用POST請求,GET請求只能提交普通的字串(這是HTTP協議規定!)

2、form表單的檔案控制元件是type="file"的input控制元件。

3、form標籤的enctype屬性是用來規定在傳送表單資料之前如何對其進行編碼,必須設定為:multipart/form-data。

enctype屬性

enctype屬性可能的值:application/x-www-form-urlencoded | multipart/form-data | text/plain。

enctype屬性預設值是:application/x-www-form-urlencoded,表示普通的form表單元素提交,在傳送前編碼所有字元,提交的引數格式遵循:name=value&name=value&name=value...。

multipart/form-data,表示不對字元編碼。直接提交二進位制檔案流。在使用包含檔案上傳控制元件的form表單時,必須使用該值。

text/plain,表示空格轉換為 "+" 加號,但不對特殊字元編碼。

index.jsp頁面程式碼

<%@page contentType="text/html; charset=utf-8"%>
<!doctype html>
<html>
    <head>
        <title>apache commons fileupload</title>
    </head>
    <body>
        
        <form action="${pageContext.request.contextPath }/fileupload" method="post" enctype="multipart/form-data">
            <%-- 普通的控制元件 --%>
            username<input type="text" name="username"><br> <%-- FileItem --%>
            <%-- 檔案控制元件 --%>
            file1<input type="file" name="file1"><br> <%-- FileItem --%>
            file2<input type="file" name="file2"><br> <%-- FileItem --%>
            <input type="submit" value="submit">
        </form>
        
    </body>
</html>

後端接收檔案介面

準備JAR包,新增到專案中

Servlet程式碼

package com.wb.controller;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet(urlPatterns = {"/fileupload"})
public class FileUpController extends HttpServlet{

   private static final long serialVersionUID = 5351212300627874456L;

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
       //建立一個“硬碟檔案條目工廠”物件
       DiskFileItemFactory factory = new DiskFileItemFactory();
       //設定閾值,設定JVM一次能夠處理的檔案大小(預設吞吐量是10KB)
       factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
       //設定臨時檔案的儲存位置(檔案大小大於吞吐量的話就必須設定這個值,比如檔案大小:1GB ,一次吞吐量:1MB)
       factory.setRepository(new File("E:\\TestFileUpload\\files"));
       
       //建立核心物件
       ServletFileUpload fileUpload = new ServletFileUpload(factory);
       //設定最大可支援的檔案大小(10MB)
       fileUpload.setFileSizeMax(1024*1024*10);
       //設定轉換時使用的字符集
       //fileUpload.setHeaderEncoding("UTF-8");
       
       if (ServletFileUpload.isMultipartContent(req)) {
           try {
               //解析請求
               List<FileItem> fileItems = fileUpload.parseRequest(req);
               for (FileItem fileItem : fileItems) {
                   if(fileItem.isFormField()) {//判斷該FileItem為一個普通的form元素
                       //獲取欄位名
                       String fieldName = fileItem.getFieldName();
                       //獲取欄位值,並解決亂碼
                       String fieldValue = fileItem.getString("UTF-8");
                       //String fieldValue = fileItem.getString();
                       System.out.println(fieldName + ":" + fieldValue);
                   }else {//判斷該FileItem為一個檔案
                       //獲取檔名
                       String fileName = fileItem.getName();
                       System.out.println("fileName=" + fileName);
                       //獲取檔案大小
                       long fileSize = fileItem.getSize();
                       System.out.println("fileSize=" + fileSize);
                       fileItem.write(new File("E:\\TestFileUpload\\files" + File.separator + fileName));
                   }
               }
           } catch (FileUploadException e) {
               e.printStackTrace();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
   }

}