code

SpringBoot 파일 업로드 크기 제한이 Multipart 가져오기를 초과하는 경우최대 업로드 크기 대신 예외 발생초과됨예외.

starcafe 2023. 7. 22. 10:18
반응형

SpringBoot 파일 업로드 크기 제한이 Multipart 가져오기를 초과하는 경우최대 업로드 크기 대신 예외 발생초과됨예외.

저는 최대 파일 업로드 파일 크기가 2MB인 간단한 SpringBoot 앱 파일 업로드 기능을 가지고 있습니다.

구성했습니다.multipart.max-file-size=2MB잘 작동하고 있습니다.그러나 2MB보다 큰 파일을 업로드하려고 하면 오류를 처리하고 오류 메시지를 표시합니다.

이를 위해 컨트롤러를 사용하고 있습니다.HandlerExceptionResolver와 함께resolveException()다음과 같은 구현:

public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception exception)
    {        
        Map<String, Object> model = new HashMap<String, Object>();
        if (exception instanceof MaxUploadSizeExceededException)
        {
            model.put("msg", exception.getMessage());
        } else
        {
            model.put("msg", "Unexpected error: " + exception.getMessage());
        }

        return new ModelAndView("homepage", model);
    }

문제는 예외 가져오기가 다중 부분이라는 것입니다.최대 업로드 크기 대신 예외 발생초과됨예외.

스택 추적: 다중 파트 서블릿 요청을 구문 분석할 수 없습니다. 중첩된 예외는 java.lang입니다.잘못된 상태 예외: org.apache.tomcat.util.http.파일 업로드입니다.FileUploadBase$파일 크기 제한초과됨예외: myFile 필드가 최대 허용 크기인 2097152바이트를 초과합니다.

파일 크기가 초과되는 경우 MaxUploadSize가 표시됩니다.초과됨예외?상위 예외 멀티파트를 받는 중입니다.파일 크기 외에도 여러 가지 이유로 발생할 수 있는 예외가 다음을 초과합니다.

이것에 대한 의견이 있습니까?

동일한 문제에 직면했습니다. Commons 파일 업로드 구현의 Multipart Resolver만 MaxUploadSize를 슬로우하는 것 같습니다.초과됨예외이지만 MultipartResolver Servlet 3.0 구현에는 해당되지 않습니다.

지금까지 제가 한 일은 이렇습니다.여기서 핵심은 파일을 컨트롤러에서 확인할 수 있도록 허용한 다음 크기를 확인하고 오류를 설정할 수 있습니다.

  1. multipart 아래에 multipart 속성 설정: max-file-size: -1 max-request-size: -1

  2. 세트 Tomcat 8 (maxSwallowSize="-1")

  3. 컨트롤러에서 크기 확인을 위한 논리 추가

    if(fileAttachment.getSize() > 10485760) {새 MaxUploadSize 던지기초과됨예외(fileAttachment.getSize(); }

별로 좋지는 않지만, 제 빠르고 더러운 해결책은 그들이 그들을 죽었는지 확인하는 것이었습니다.MultipartException메시지 문자열에 텍스트가 포함되었습니다.SizeLimitExceededException메시지에서 최대 파일 크기 정보를 추출합니다.

저의 경우 tomcat 8.0.x에서 발생한 예외는 org.apache.tomcat.util.http.fileupd였습니다.FileUploadBase$Size 제한초과됨예외: 요청 크기(177351)가 구성된 최대값(2048)을 초과하여 요청이 거부되었습니다.

알메로가 지적했듯이, 만약 당신이 그것을 사용한다면, 명심하세요.CommonsMultipartResolver는 ▁rather다도.StandardServletMultipartResolver,aMaxUploadSizeExceededException처리하기에 훨씬 더 좋은 것으로 던져질 것입니다.는 다음코다처니다리합음을는을 처리합니다.MultipartException멀티파트 레졸바 전략에 의해 던져집니다.

@ControllerAdvice
public class MultipartExceptionExceptionHandler {
  @ExceptionHandler(MultipartException.class)
  public String handleMultipartException(MultipartException ex, RedirectAttributes ra) {
    String maxFileSize = getMaxUploadFileSize(ex);
    if (maxFileSize != null) {
      ra.addFlashAttribute("errors", "Uploaded file is too large.  File size cannot exceed " + maxFileSize + ".");
    }
    else {
      ra.addFlashAttribute("errors", ex.getMessage());
    }
    return "redirect:/";
  }

  private String getMaxUploadFileSize(MultipartException ex) {
    if (ex instanceof MaxUploadSizeExceededException) {
      return asReadableFileSize(((MaxUploadSizeExceededException)ex).getMaxUploadSize());
    }
    String msg = ex.getMessage();
    if (msg.contains("SizeLimitExceededException")) {
      String maxFileSize = msg.substring(msg.indexOf("maximum")).replaceAll("\\D+", "");
      if (StringUtils.isNumeric(maxFileSize)) {
        return asReadableFileSize(Long.valueOf(maxFileSize));
      }
    }

    return null;
  }

  // http://stackoverflow.com/a/5599842/225217
  private static String asReadableFileSize(long size) {
    if(size <= 0) return "0";
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" };
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups];
  }
}

application.properties의 다음 값이 저를 위해 작동했습니다.허용 가능한 파일 크기를 무제한으로 만드는 것 같습니다.

multipart.maxFileSize=-1

multipart.maxRequestSize=-1

이제 컨트롤러 측에서 논리를 추가해야 합니다.

@PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {

        long size = file.getSize();

        if(size > 10000000)
        {
            redirectAttributes.addFlashAttribute("message",
                    "You file " + file.getOriginalFilename() + "! has not been successfully uploaded. Requires less than 10 MB size.");
            return "redirect:/upload";
        }
        }

언급URL : https://stackoverflow.com/questions/35379748/springboot-when-file-upload-size-limit-exceeds-getting-multipartexception-instea

반응형