2012-05-26 3 views
2

Tomcat 6을 사용하여 이미지 업로드를 허용하기 위해 아파치 공유 파일 업로드를 사용하고 있습니다. setSizeMax 및 setFileSizeMax를 사용하여 max 파일을 설정할 수 있습니다. 그러나 큰 파일 전체가 업로드되고 너무 크면 너무 많이 확인 된 것 같습니다. 다른 post에 따르면, setSizeMax가 업로드를 차단해야하는 것으로 보입니다. 그러나 그것은 내가 얻는 동작이 아닙니다.apache commons FileUpload - 전체 파일 업로드 전에 큰 파일 자르기

이를 테스트하기 위해, 나는 매우 낮은 sizeMax 및 fieSizeMax을 설정하고 오히려 큰 파일을 업로드했습니다. 대용량 파일을 거의 순간적으로 잘라내는 대신 15 초 동안 업로드하는 데 걸렸습니다.

아이디어가 있으십니까? 다음은 예외 조항이 단순화 된 코드입니다.

FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     upload.setFileSizeMax(30); 
     upload.setSizeMax(28); 
     List items = null; 
     try { 
      items = upload.parseRequest(request); 
     } catch (Exception e) { 
      out.println("exceeded max file size.."); 
      return; 
     } 

MORE INFO : 다중/폼 데이터 : 바람둥이 6. maxPostSize 콘텐츠 유형이 작동하지 않습니다 설정을 사용하여. 또한 요청 내용 길이를 다시 확인하려면 전체 파일을 업로드해야합니다. 마지막으로 FileUpload의 김이 튀는 API를 사용하면 스트림이 닫힐 수 있기 전에 전체 파일을 다시 업로드해야하는 것처럼 보이기 때문에 작동하지 않는 것 같습니다. 서블릿이 바이트를 디스크에 쓰지 않더라도 업로드는 계속됩니다. 이미지 업로드 등 웹 애플 리케이션을위한 매우 일반적인 작업이기 때문에 바람둥이 6을 사용하여 거대한 업로드를 방지하는 방법이 있어야합니다.

+0

사용자가 HTML5 호환 브라우저를 사용하도록 요구할 수있는 경우 클라이언트 측에서 유효성을 검사 할 수 있습니다. http://stackoverflow.com/questions/4112575/client-checking-file-size-using-html5 – rickz

+0

@rickz를 참조하십시오. 서버 측을 보호하기 위해 클라이언트 측 검사/검증에 의존하는 것은 결코 좋은 생각이 아닙니다. 수표는 너무 쉽게 파괴 될 수 있습니다. –

+0

@StephenC 이것은 보안 위험이있는 것은 아닙니다. 웹 앱 성능을 향상시키기위한 노력 일뿐입니다. 클라이언트 측 유효성 검사가 실패하면 서버는 항상 업로드를 거부 할 수 있습니다. – rickz

답변

1

클라이언트가 서버에 저장했는지 여부에 관계없이 클라이언트가 비트를 보냅니다. 서버가 강제로 입력 스트림을 닫지 않을 정도로 비트를 보내는 것을 중지하도록 클라이언트에 알릴 방법은 없습니다 (HTTP의 성격으로 인해 응답이 요청을 따르고 동시에 존재하지 않음). 시도해 볼 수는 있지만 대부분의 응용 프로그램 서버는 close()를 수행 할 때 클라이언트의 입력 스트림을 소모하므로 아무 것도 변경되지 않습니다.

클라이언트를 제어하고 100-Continue (Expect 헤더를 통해)를 사용해야하는 경우 요청의 Content-Length를 스누핑하고 100 비트 대신 부정 응답을 보내 거부 할 수 있습니다. 잇다.

0

Tomcat에는 HTTP 커넥터에 대한 maxPostSize 속성이 있습니다. Tomcat docs

편집 : 너무 복잡하여 multipart/form-data에 적합하지 않습니다. 서명 된 애플릿을 사용하거나 "Java Web Start"를 사용하여 업로드를 관리 하시겠습니까?

+0

내가 말할 수있는 한, request.getContentLength는 전체 파일이 업로드 될 때까지 기다린다. 따라서 거대한 파일이 계속 업로드되고 테스트를 실행할 수 있습니다. 그것이 내가 얻는 것입니다. – adamSpline

+0

content-type multipart/form-data에는 maxPostSize가 작동하지 않습니다. 콘텐츠 유형 application/x-www-form-urlencoded에서만 작동합니다. 따라서 maxPostSize를 설정하면 웹 양식을 통해 이미지를 업로드하는 일반적인 경우에는 아무런 영향을 미치지 않습니다. 내 테스트에서 maxPostSize는 일반적으로 아파치 공유 FileUpload를 사용하는 경우에는 완전히 무시됩니다. 이 게시물을 참조하십시오 : [link] (http://tomcat.10.n6.nabble.com/The-purpose-of-maxPostSize-td2158253.html). – adamSpline

+0

이전 솔루션에서는 애플릿을 사용하여 이러한 유형의 시나리오를 제어했지만보다 정교한 커뮤니티를 위해 설계된 응용 프로그램을 사용했습니다. 현재 프로젝트의이 섹션에서는 사용자가 이미지를 간단하게 업로드 할 수 있어야합니다. 나는 서명 된 애플릿이 사용자들을 혼란스럽게 할 것이라고 생각한다. 사람들은 항상 이미지 업로드를 처리 할 수있는 webapps를 개발하므로 표준 접근 방식이 필요합니다. 아니면 다른 유형의 서버를 선택하여 업로드를 처리해야합니까? 핵심 애플 리케이션은 여전히 ​​자바에 woudl,하지만 난 업로드에 대한 다른 기술과 전용 VPS를 사용할 수 있습니까? 제안 사항 – adamSpline

관련 문제