1. 소개

이 빠른 사용방법(예제)에서는 서블릿에서 파일을 업로드하는 방법을 살펴 봅니다.

이를 달성하기 위해 먼저 네이티브 @MultipartConfig 어노테이션에서 제공하는 파일 업로드 기능을 갖춘 바닐라 Jakarta EE 솔루션을 살펴 보겠습니다 .

그런 다음  이전 버전의 Servlet API에 대한 Apache Commons FileUpload 라이브러리를 살펴 보겠습니다 .

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;
}

서블릿 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.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

최신 버전은 Maven의 중앙 저장소 ( commons-fileuploadcommons-io) 에서 빠른 검색을 통해 찾을 수 있습니다 .

3.2. 서블릿 업로드

Apache의 FileUpload 라이브러리 를 통합하는 세 가지 주요 부분 은 다음과 같습니다.

  • .jsp 페이지 의 업로드 양식 .
  • DiskFileItemFactoryServletFileUpload 개체를 구성합니다 .
  • 멀티 파트 파일 업로드의 실제 내용을 처리합니다.

업로드 양식은 이전 섹션의 양식과 동일합니다.

자카르타 EE 서블릿을 만드는 단계로 넘어 갑시다.

요청 처리 방법에서 들어오는 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 인스턴스에 드롭하고 시작할 수 있습니다.

여기에서 양식이있는 기본 업로드보기를 표시 할 수 있습니다.

파일을 성공적으로 업로드하면 다음 메시지가 표시됩니다.

마지막으로 서블릿에 지정된 위치를 확인할 수 있습니다.

5. 결론

그게 다야! Jakarta EE와 Apache의 Common FileUpload 라이브러리를 사용하여 멀티 파트 파일 업로드를 제공하는 방법을 배웠습니다 !

항상 그렇듯이 코드 조각 은 GitHub 에서 찾을 수 있습니다 .