복붙노트

[SPRING] 허용되는 최대 크기와 관련된 Tomcat으로 파일 업로드하기

SPRING

허용되는 최대 크기와 관련된 Tomcat으로 파일 업로드하기

나는 Spring에서 상당히 새로운데, JSP로 에러 메시지를 보여주기 위해서 multipart 폼을 가지고 MaxUploadSizeExceededException 예외를 처리하고 싶다. 내가 가진 주된 문제는 MaxUploadSizeLimitExceededExceptionResolver 클래스의 ModelAndView 객체이다. 이전에 설명한 그러한 목적을 위해 사용하는 방법을 모른다.

내가 가지고있는 파일 : 1) 모델 클래스 UploadItem.java. 2) UploadForm.jsp 양식을 봅니다. 3) 컨트롤러 Uploadcontroller.java. 4) 예외를 처리하는 클래스 MaxUploadSizeLimitExceededExceptionResolver.java Uploadcontroller

1) 모델 UploadItem

public class UploadItem {
    private String name;
    private CommonsMultipartFile fileData;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public CommonsMultipartFile getFileData() {
        return fileData;
    }
    public void setFileData(CommonsMultipartFile fileData) {
        this.fileData = fileData;
    }
}

2) UploadForm.jsp 양식보기

<html>
    <head>
        <META http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <title>Upload form</title>
    </head>
    <body>
        <form:form modelAttribute="uploadItem" method="post" enctype="multipart/form-data">
            <fieldset>
                <legend>Upload Fields</legend>
                <p>
                    <form:label for="name" path="name">Name</form:label><br/>
                    <form:input path="name"/>
                </p>
                <p>
                    <form:label for="fileData" path="fileData">File</form:label><br/>
                    <form:input path="fileData" type="file"/>
                </p>
                <p>
                    <input type="submit" />
                </p>
            </fieldset>
        </form:form>
    </body>
</html>

3) 컨트롤러 Uploadcontroller

public class Uploadcontroller {
    @RequestMapping(method = RequestMethod.GET)
    public String getUploadForm(Model model) {
        model.addAttribute(new UploadItem());
        return "upload/uploadForm";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String create(HttpServletRequest request, UploadItem uploadItem,
            BindingResult result, Exception exception) {
        if (result.hasErrors()) {
            // logger.info("create upload");
            for (ObjectError error : result.getAllErrors()) {
                System.err.println("Error: " + error.getCode() + " - "
                        + error.getDefaultMessage());
            }
            return "upload/uploadForm";
        }

        System.err.println("Test upload: " + uploadItem.getName());
        System.err.println("Test upload: "
                + uploadItem.getFileData().getOriginalFilename());

        // TODO redirect this
        return "/home";
    }
}

4) 예외를 처리하는 컴포넌트 Uploadcontroller

@Component
public class MaxUploadSizeLimitExceededExceptionResolver extends
        SimpleMappingExceptionResolver {
    private static final Logger logger = LoggerFactory
            .getLogger(HomeController.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception exception) {
        Map<String, Object> model = new HashMap<String, Object>();
        logger.info("getUploadForm at the beggining");
        ModelAndView modelView = new ModelAndView();
        if (exception instanceof MaxUploadSizeExceededException)
        {
            model.put("errors", exception.getMessage());
            modelView.addObject("errors", exception.getMessage());
            logger.info("getUploadForm: MaxUploadSizeExceededException" );
        } else
        {
            model.put("errors", "Unexpected error: " + exception.getMessage());
            modelView.addObject("errors", "Unexpected error: " +exception.getMessage());
        }
        logger.info("getUploadForm at the end" );        
        model.put("uploadedFile", new UploadItem());
        modelView.addObject(new UploadItem());//("uploadedFile", new UploadItem());
        modelView.setViewName("/upload/uploadForm");
        return modelView;
    }
}

세부 정보를 추가하려면 수정 : 실제로 문제는 다른 방향입니다. 내 maxUploadSize 파일의 크기는 1MB로 설정되었지만 3MB보다 큰 파일로 테스트를 수행하려고했습니다. 최대 2 MB까지 파일을 시도하면 정상적으로 작동합니다. 문제는 내가 ERR_CONNECTION_RESET을 얻었고 Tomcat, maxSwallowSize의 설정과 관련이있는 것 같습니다. -> stackoverflow.com/questions/29113262/ ... 나는이 스레드를 계속 연구하고 유지할 것입니다.

새로운 정보. 나는 Tomcat 7.0.61을 사용해 보았는데 오류는 ERR_CONNECTION_ABORTED이다. Tomcat 6.0.43을 사용해 보았습니다. 오류가 없습니다!

해결법

  1. ==============================

    1.조사한 결과 문제는 Tomcat 때문이었습니다. 7.0.55 버전에서는 기본적으로 maxSwallowSize 속성이 2MB로 설정되었습니다. 이로 인해 Tomcat이 업로드 요청을 중단했습니다. 이 속성을 다른 값으로 설정하면 문제가 해결됩니다 (이 값을 -1로 변경하면 PRD 환경에서 Tomcat이 실제로 XMB 파일을 업로드하려고하므로이 작업을 수행하지 마십시오). 나는 Tomcat 서버 파일에 $ {tomcat_dir} /conf/server.xml 파일을 내 커넥터 속성에 maxSwallowSize 속성을 추가하여 추가했다.

    조사한 결과 문제는 Tomcat 때문이었습니다. 7.0.55 버전에서는 기본적으로 maxSwallowSize 속성이 2MB로 설정되었습니다. 이로 인해 Tomcat이 업로드 요청을 중단했습니다. 이 속성을 다른 값으로 설정하면 문제가 해결됩니다 (이 값을 -1로 변경하면 PRD 환경에서 Tomcat이 실제로 XMB 파일을 업로드하려고하므로이 작업을 수행하지 마십시오). 나는 Tomcat 서버 파일에 $ {tomcat_dir} /conf/server.xml 파일을 내 커넥터 속성에 maxSwallowSize 속성을 추가하여 추가했다.

    <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443" 
        maxSwallowSize="-1"/>
    

    Tomcat을 다시 시작하여이 구성을 수행해야합니다. 작동하지 않으면 서버를 삭제하고 다시 추가하십시오.

  2. from https://stackoverflow.com/questions/29684691/uploading-files-in-spring-with-tomcat-related-to-the-maximum-size-allowed by cc-by-sa and MIT license