1. 程式人生 > 其它 >使用Servlet和JSP上傳檔案

使用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-fileuploadcommons-io

3.2。上載Servlet

合併Apache的FileUpload庫的三個主要部分如下:

  • .jsp頁面中的上載表單。
  • 配置您的DiskFileItemFactoryServletFileUpload物件。
  • 處理分段檔案上傳的實際內容。

上傳表單與上一節中的表單相同。

讓我們繼續建立我們的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上找到程式碼段。