使用Servlet和JSP上傳檔案
1.簡介
在本快速教程中,我們將看到如何從Servlet上傳檔案。
為此,我們將首先看到具有原生@MultipartConfig批註提供的檔案上傳功能的普通Jakarta EE解決方案。
然後,我們將遍歷Apache CommonsFileUpload庫,以獲取Servlet API的早期版本。
2.使用Jakarta EE@MultipartConfig
Jakarta EE可以開箱即用地支援分段上傳。
因此,當通過檔案上傳支援豐富Jakarta EE應用程式時,這可能是預設的選擇。
首先,讓我們向HTML檔案中新增一個表單:
<form method="post" action="multiPartServlet" enctype="multipart/form-data">
Choose a file: <input type="file" name="multiPartServlet" />
<input type="submit" value="Upload" />
</form>
應當使用enctype =” multipart / form-data”屬性定義表單,以表示分段上傳。
接下來,我們將使用@MultipartConfig批註使用正確的資訊批註HttpServlet:
@MultipartConfig(fileSizeThreshold = 1024 * 1024,
maxFileSize = 1024 * 1024 * 5,
maxRequestSize = 1024 * 1024 * 5 * 5)
public class MultipartServlet extends HttpServlet {
//...
}
然後,確保設定了預設的伺服器上傳資料夾:
String uploadPath = getServletContext().getRealPath("" ) + File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
最後,我們可以使用getParts()方法輕鬆地從請求中檢索入站檔案,並將其儲存到磁碟中:
for (Part part : request.getParts()) {
fileName = getFileName(part);
part.write(uploadPath + File.separator + fileName);
}
請注意,在此示例中,我們使用了輔助方法getFileName():
private String getFileName(Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename"))
return content.substring(content.indexOf("=") + 2, content.length() - 1);
}
return Constants.DEFAULT_FILENAME;
}
對於Servlet 3.1。專案,我們也可以使用Part.getSubmittedFileName()方法:
fileName = part.getSubmittedFileName();
3.使用Apache Commons FileUpload
如果我們不在Servlet 3.0專案上,則可以直接使用Apache Commons FileUpload庫。
3.1。設定
我們將要使用以下pom.xml依賴關係來使示例執行:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
可以在Maven的中央儲存庫中快速搜尋找到最新版本:commons-fileupload和commons-io。
3.2。上載Servlet
合併Apache的FileUpload庫的三個主要部分如下:
- .jsp頁面中的上載表單。
- 配置您的DiskFileItemFactory和ServletFileUpload物件。
- 處理分段檔案上傳的實際內容。
上傳表單與上一節中的表單相同。
讓我們繼續建立我們的Jakarta EE servlet。
在我們的請求處理方法中,我們可以對傳入的HttpRequest進行包裝,以檢查它是否是分段上傳。
我們還將在DiskFileItemFactory上指定哪些資源可臨時分配給檔案上傳(正在處理)。
最後,我們將建立一個ServletFileUpload物件,該物件代表實際的檔案本身。它將為最終永續性伺服器端公開分段上傳的內容:
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MEMORY_THRESHOLD);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(MAX_FILE_SIZE);
upload.setSizeMax(MAX_REQUEST_SIZE);
String uploadPath = getServletContext().getRealPath("")
+ File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
//...
}
然後,我們可以提取這些內容並將其寫入磁碟:
if (ServletFileUpload.isMultipartContent(request)) {
//...
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
for (FileItem item : formItems) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);
request.setAttribute("message", "File "
+ fileName + " has uploaded successfully!");
}
}
}
}
4.執行示例
將專案編譯成.war之後,可以將其放入本地Tomcat例項中並啟動它。
從那裡,我們可以調出主上傳檢視,並在其中顯示一個表單:
成功上傳檔案後,我們將看到以下訊息:
最後,我們可以檢查servlet中指定的位置:
5.結論
而已!我們已經學習瞭如何使用Jakarta EE和Apache的CommonFileUpload庫提供多部分檔案上傳!
與往常一樣,可以在GitHub上找到程式碼段。