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-fileupload 및 commons-io) 에서 빠른 검색을 통해 찾을 수 있습니다 .
3.2. 서블릿 업로드
Apache의 FileUpload 라이브러리 를 통합하는 세 가지 주요 부분 은 다음과 같습니다.
- .jsp 페이지 의 업로드 양식 .
- DiskFileItemFactory 및 ServletFileUpload 개체를 구성합니다 .
- 멀티 파트 파일 업로드의 실제 내용을 처리합니다.
업로드 양식은 이전 섹션의 양식과 동일합니다.
자카르타 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 에서 찾을 수 있습니다 .