Apache Tomcat 설정 최대 파일 업로드 크기

Apache Tomcat 설정 최대 파일 업로드 크기

나는 Grails/Groovy 웹 앱을 구현 중입니다. 사용자의 파일 업로드 크기를 제한하고 싶습니다. 누군가가 내 서버에 10GB 파일을 업로드하는 것을 원하지 않습니다. 내가 알아낸 것은 크기를 계산하는 대부분의 접근 방식은 파일이 이미 업로드된 후에 수행된다는 것입니다. 누군가가 10개의 프로필을 올리고 10GB 크기의 파일 10개를 업로드하면 어떻게 될까요? 이는 서버를 소진시키고 서버 디스크에서 너무 많은 공간을 차지할 수 있습니다. 그래서 나는 이것을 방지하려고 노력하고 있습니다.

나는 Apache Tomcat이 하드 코딩된 또는 주석 접근 방식으로 다음 구성을 허용한다는 것을 알아냈습니다. 최대 파일 크기가 업로드 프로세스 중에 계산되는지 아니면 파일이 임시 장소에 업로드된 후에 계산되는지 잘 모르겠습니다. 설명서에는 다음 내용이 나와 있습니다.

@MultipartConfig 주석은 다음과 같은 선택적 속성을 지원합니다.

위치: 파일 시스템의 디렉터리에 대한 절대 경로입니다. 위치 속성은 애플리케이션 컨텍스트에 상대적인 경로를 지원하지 않습니다. 이 위치는 부품이 처리되는 동안 또는 파일 크기가 지정된 fileSizeThreshold 설정을 초과하는 경우 파일을 임시로 저장하는 데 사용됩니다. 기본 위치는 ""입니다.

fileSizeThreshold: 파일이 디스크에 임시 저장되기 전까지의 파일 크기(바이트)입니다. 기본 크기는 0바이트입니다.

MaxFileSize: 업로드된 파일에 허용되는 최대 크기(바이트)입니다. 업로드된 파일의 크기가 이 크기보다 크면 웹 컨테이너에서 예외(IllegalStateException)가 발생합니다. 기본 크기는 무제한입니다.

maxRequestSize: 다중 부분/양식 데이터 요청에 허용되는 최대 크기(바이트)입니다. 업로드된 모든 파일의 전체 크기가 이 임계값을 초과하면 웹 컨테이너에서 예외가 발생합니다. 기본 크기는 무제한입니다.

주석 접근 방식:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

하드코딩된 값은 다음과 같습니다.

<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>

업로드 프로세스 중에 MaxFileSize가 계산되는지 누구든지 명확히 설명해 주시면 감사하겠습니다.

답변1

MaxFileSize는 전체 파일이 이미 업로드된 후에 계산됩니다. 웹 앱에 파일(1GB 크기)을 업로드하면 실제로 무슨 일이 일어나는지 알 수 있습니다. 따라서 Tomcat에 의존하는 것은 의미가 없습니다. Servlet에서 동일한 작업을 수행하는 것이 가능하지만 카운터가 MaxFileSize에 도달하면 기본 HTTP 연결을 어떻게 끊을 수 있습니까? 제 생각엔 당신에겐 방법이 없는 것 같아요. HTTP 프로토콜은 단방향이므로 브라우저에 시간 내에 긴 게시물을 취소하라고 지시할 수도 없습니다. 당신이 할 수 있는 유일한 일은 카운터가 임계값에 도달할 때 파일 전송이 완료될 때까지 디스크 공간을 보호하기 위해 입력 스트림의 후속 바이트를 무시하는 것입니다.

관련 정보