5

tôi đã thiết lập kích thước tập tin tối đa đểtập tin dung nhiều kích thước tối đa ngoại lệ - khởi động mùa xuân embbeded tomcat

multipart.maxFileSize: 1mb 
multipart.maxRequestSize: 1mb 

Đây là bộ điều khiển của tôi:

@RequestMapping(method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 
@ResponseStatus(HttpStatus.CREATED) 
@Secured(Privileges.CAN_USER_READ) 
public void create(@RequestParam("file")final MultipartFile file,Principal principal) throws IllegalStateException, IOException,MultipartException{ 

    medicalHistoryService.create(new MedicalHistory(file)); 
} 

đây là thông báo lỗi

2016-03-03 13:48:24.560 WARN 4992 --- [nio-8080-exec-1] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576) 

2016-03-03 13:48:25.545 WARN 4992 --- [nio-8080-exec-2] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576) 

Và kết quả cuối cùng sau khi yêu cầu với tập tin quá khổ là vấn đề tải trang. Tôi không nhận được bất kỳ lỗi nào khác trong stack trace vì vậy tôi kinda mắc kẹt với những gì đang thực sự xảy ra. Oh yeah tôi đã thử nhiều giải pháp khác như đăng ký bộ lọc, xử lý ngoại lệ trong ErrorController. Mỗi lần tôi sẽ kết thúc với cùng một kết quả - sự cố máy chủ. Tomcat crash

EDIT 2

My ngoại lệ xử lý lớp:

@ControllerAdvice 
public class RestResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler{ 

// 413 MultipartException - file size too big 
@ExceptionHandler({MultipartException.class,FileSizeLimitExceededException.class,java.lang.IllegalStateException.class}) 
public ResponseEntity<Object> handleSizeExceededException(final WebRequest request, final MultipartException ex) { 
    //log.warn("413 Status Code. File size too large {}", ex.getMessage()); 
    log.warn(ex.getMessage()); 
    final ApiError apiError = message(HttpStatus.PAYLOAD_TOO_LARGE, ex); 
    return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request); 
} 

}

+0

Bạn chưa hiển thị đủ mã của mình. Ví dụ, 'handleExceptionInternal' làm gì. [Ví dụ tối thiểu, đầy đủ, có thể xác minh] (http://stackoverflow.com/help/mcve) sẽ giúp mọi người dễ dàng trợ giúp bạn hơn. –

+0

'handleExceptionInternal' là phương thức nội bộ của 'ResponseEntityExceptionHandler', theo tài liệu" Một lớp cơ sở thuận tiện cho các lớp {@link ControllerAdvice @ControllerAdvice} * muốn cung cấp xử lý ngoại lệ tập trung ". –

Trả lời

10

Đây là khéo léo. Thuộc tính Tomcat MaxSwallowSize đã gây ra sự cố này. Rõ ràng nó đã được giới thiệu trong một trong những phiên bản gần đây của Tomcat. Toàn bộ ý tưởng đằng sau nó là nếu Tomcat nhận ra yêu cầu sẽ bị từ chối, để chấm dứt kết nối bất cứ thứ gì cao hơn 2mb mặc định (ít nhất đây là giải thích của tôi). Việc ghi đè đơn giản thuộc tính này sẽ khắc phục mọi thứ. Tôi nhận ra đây không phải là giải pháp hoàn hảo, nhưng nó hoàn toàn tốt hơn rất nhiều so với việc chấm dứt kết nối.

@Bean 
public TomcatEmbeddedServletContainerFactory containerFactory() { 
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { 
     @Override 
     public void customize(Connector connector) { 
     ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1); 
     } 
    }); 
    return factory; 
} 
+0

Bạn vừa lưu tôi đăng bài về cơ bản cùng một mã trong câu hỏi. Tôi nghi ngờ tôi sẽ phát hiện ra câu trả lời, nếu bao giờ, mà không có nhiều giờ rắc rối để cảm ơn bạn, cảm ơn bạn, cảm ơn bạn. –

+1

@TimPerry Bạn được chào đón. Luôn sẵn sàng giúp đỡ :) –

+0

Cảm ơn bạn, bạn đã đóng đinh nó, nó sẽ là một phần của tài liệu Springboot. – lekant

0

tôi đã viết một số dòng trong application.yml để giải quyết vấn đề này như:

spring: 
    http: 
     multipart: 
      max-file-size: 10MB 
      max-request-size: 10MB 

Nó giúp trong khi tôi viết trong app ication.properties nhưng không phải trong yml.

+0

Bài đăng này không phải là nỗ lực thực sự khi trả lời câu hỏi.Xin lưu ý rằng [Stack Overflow không hoạt động như một diễn đàn thảo luận] (http://stackoverflow.com/about), đây là một trang hỏi đáp, trong đó mỗi bài đăng là một câu hỏi hoặc một câu trả lời cho một câu hỏi. Bài viết cũng có thể có [comments] (http://stackoverflow.com/help/privileges/comment) - các câu nhỏ như thế này - có thể được sử dụng để phê bình hoặc yêu cầu làm rõ từ tác giả. Đây phải là nhận xét hoặc [câu hỏi mới] (http://stackoverflow.com/questions/ask). –

+0

Tôi đã chỉnh sửa để xóa câu hỏi trong câu trả lời của bạn vì câu trả lời chỉ có nghĩa vụ cung cấp câu trả lời. Bạn có thể đăng câu hỏi đó dưới dạng nhận xét hoặc làm câu hỏi mới. –

Các vấn đề liên quan