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(); } } } }
Apache Commons FileUpload實現文件上傳