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 구현에는 해당되지 않습니다.
지금까지 제가 한 일은 이렇습니다.여기서 핵심은 파일을 컨트롤러에서 확인할 수 있도록 허용한 다음 크기를 확인하고 오류를 설정할 수 있습니다.
multipart 아래에 multipart 속성 설정: max-file-size: -1 max-request-size: -1
세트 Tomcat 8 (maxSwallowSize="-1")
컨트롤러에서 크기 확인을 위한 논리 추가
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
'code' 카테고리의 다른 글
표 2에서 표 1 업데이트(새로 삽입, 업데이트만 변경, 누락 제거) (0) | 2023.07.22 |
---|---|
효율적인 양방향 해시 테이블을 구현하는 방법은 무엇입니까? (0) | 2023.07.22 |
DB2와 Oracle의 차이점 (0) | 2023.07.22 |
Java Spring Security: 401 토큰 OAuth2 엔드포인트에 대해 승인되지 않음 (0) | 2023.07.22 |
MariaDB 기본 플로트는 소수점 이하의 자리를 포함할 수 없습니다. (0) | 2023.07.22 |