1. 개요
아파치 커먼즈 파일 업로드 도서관은 우리가 사용하는 HTTP 프로토콜을 통해 대용량 파일을 업로드하는 데 도움이 다중 / 폼 데이터의 콘텐츠 형식을.
이 빠른 사용방법(예제)에서는이를 Spring과 통합하는 방법을 살펴 보겠습니다.
2. Maven 의존성
라이브러리를 사용하려면 commons-fileupload 아티팩트 가 필요합니다 .
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
최신 버전은 Maven Central 에서 찾을 수 있습니다 .
3. 한꺼번에 전송
데모 목적으로 파일 페이로드 를 사용하여 요청을 처리 하는 컨트롤러 를 만들 것입니다 .
@PostMapping("/upload")
public String handleUpload(HttpServletRequest request) throws Exception {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(
new File(System.getProperty("java.io.tmpdir")));
factory.setSizeThreshold(
DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
factory.setFileCleaningTracker(null);
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (!item.isFormField()) {
try (
InputStream uploadedStream = item.getInputStream();
OutputStream out = new FileOutputStream("file.mov");) {
IOUtils.copy(uploadedStream, out);
}
}
}
return "success!";
}
처음 에는 라이브러리 의 ServletFileUpload 클래스 에있는 isMultipartContent 메서드를 사용하여 요청에 멀티 파트 콘텐츠가 포함되어 있는지 확인해야합니다 .
기본적으로 Spring에는 이 라이브러리를 사용하기 위해 비활성화해야하는 MultipartResolver 가 있습니다. 그렇지 않으면 컨트롤러에 도달하기 전에 요청 내용을 읽습니다 .
application.properties 파일에 다음 구성을 포함하여이를 달성 할 수 있습니다 .
spring.http.multipart.enabled=false
이제 파일을 저장할 디렉토리, 라이브러리가 디스크에 쓰기로 결정하는 임계 값 및 요청이 끝난 후 파일을 삭제해야하는지 여부를 설정할 수 있습니다.
라이브러리는 파일 저장 및 정리를위한 구성을 담당 하는 DiskFileItemFactory 클래스를 제공합니다 . setRepository 있어서 기본이 예에 도시되어 함께 대상 디렉토리를 설정한다.
다음으로 setSizeThreshold 는 최대 파일 크기를 설정합니다.
그런 다음 null로 설정하면 임시 파일을 그대로 유지하는 setFileCleaningTracker 메서드가 있습니다. 기본적으로 요청이 완료된 후 삭제됩니다 .
이제 실제 파일 처리를 계속할 수 있습니다.
먼저 이전에 만든 팩토리를 포함하여 ServletFileUpload 를 만듭니다 . 그런 다음 요청을 구문 분석 하고 양식 필드에 대한 라이브러리의 주요 추상화 인 FileItem List을 생성 합니다.
이제 일반 양식 필드가 아니라는 것을 알고 있으면 InputStream 을 추출하고 IOUtils 에서 유용한 복사 메서드를 호출합니다 (추가 옵션은 이 사용방법(예제) 에서 볼 수 있음 ) .
이제 필요한 폴더에 파일이 저장되었습니다. 이는 파일에 쉽게 액세스 할 수 있지만 시간 / 메모리 효율성이 최적이 아니기 때문에 일반적으로이 상황을 처리하는 더 편리한 방법입니다.
다음 섹션에서는 스트리밍 API를 살펴 보겠습니다.
4. 스트리밍 API
스트리밍 API는 사용하기 쉬우므로 임시 위치에 복사하지 않고 대용량 파일을 처리 할 수있는 좋은 방법입니다.
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterStream = upload.getItemIterator(request);
while (iterStream.hasNext()) {
FileItemStream item = iterStream.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (!item.isFormField()) {
// Process the InputStream
} else {
String formFieldValue = Streams.asString(stream);
}
}
이전 코드 조각에서 더 이상 DiskFileItemFactory가 포함되지 않음을 알 수 있습니다 . 이는 스트리밍 API를 사용할 때 필요하지 않기 때문 입니다.
다음으로, 라이브러리는 필드를 처리하기 위해 다음 메서드 를 사용하여 요청에서 추출 할 때까지 아무것도 읽지 않는 FileItemIterator를 제공합니다 .
마지막으로 다른 양식 필드의 값을 얻는 방법을 볼 수 있습니다.
5. 결론
이 기사에서는 Spring과 함께 Apache Commons File Upload Library를 사용하여 대용량 파일을 업로드하고 처리하는 방법을 검토했습니다.
항상 그렇듯이 전체 소스 코드는 GitHub에서 찾을 수 있습니다 .