programing

MaxUploadSize 처리 방법초과됨예외.

newstyles 2023. 10. 21. 10:03

MaxUploadSize 처리 방법초과됨예외.

MaxUploadSizeExceededException파일의 크기가 허용된 최대 크기를 초과하는 경우 예외가 나타납니다.이 예외가 나타나면 오류 메시지를 표시합니다(예: 유효성 검사 오류 메시지).봄 3에서 이런 일을 하려면 이 예외를 어떻게 처리해야 합니까?

감사해요.

이것은 오래된 질문이기 때문에 스프링부트 2로 이것을 작동시키기 위해 어려움을 겪고 있는 미래의 사람들(미래의 나를 포함한)을 위해 추가합니다.

처음에는 스프링 응용 프로그램(속성 파일)을 구성해야 합니다.

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

내장형 Tomcat을 사용하는 경우(표준으로 제공되는 경우) 큰 본체의 요청을 취소하지 않도록 Tomcat을 구성하는 것도 중요합니다.

server.tomcat.max-swallow-size=-1

아니면 적어도 상대적으로 큰 사이즈로 설정할 수 있습니다.

server.tomcat.max-swallow-size=100MB

Tomcat에 대해 maxSwallowSize를 설정하지 않으면 오류가 처리되지만 브라우저가 응답하지 않는 이유를 디버깅하는 데 많은 시간이 낭비될 수 있습니다. 이 구성이 없으면 Tomcat이 요청을 취소하고 로그에서 응용 프로그램이 오류를 처리하는 것을 볼 수 있지만브라우저는 이미 Tomcat으로부터 요청 취소를 받았고 더 이상 응답을 듣지 않고 있습니다.

MaxUpload Size를 처리초과됨ExceptionHandler를 사용하여 ControllerAdvisory를 추가할 수 있습니다.

다음은 Kotlin의 간단한 예로, 오류가 있는 플래시 속성을 설정하고 일부 페이지로 리디렉션하는 것입니다.

@ControllerAdvice
class FileSizeExceptionAdvice {
    @ExceptionHandler(MaxUploadSizeExceededException::class)
    fun handleFileSizeException(
        e: MaxUploadSizeExceededException, 
        redirectAttributes: RedirectAttributes
    ): String {
        redirectAttributes.addFlashAttribute("error", "File is too big")
        return "redirect:/"
    }
}

참고: MaxUploadSize를 처리하려면초과됨컨트롤러 클래스에 ExceptionHandler가 직접 있는 경우에는 다음 속성을 구성해야 합니다.

spring.servlet.multipart.resolve-lazily=true

그렇지 않으면 요청이 컨트롤러에 매핑되기 전에 해당 예외가 트리거됩니다.

HandlerException Resolver를 사용하여 작동하는 솔루션을 드디어 찾았습니다.

스프링 구성에 다중 부품 레졸버 추가:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    
   <!--  the maximum size of an uploaded file in bytes -->
   <!-- <property name="maxUploadSize" value="10000000"/> -->
   <property name="maxUploadSize" value="1000"/>
</bean>   

모델 - 업로드된 파일.java:

package com.mypkg.models;

import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class UploadedFile
{
    private String title;

    private CommonsMultipartFile fileData;

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public CommonsMultipartFile getFileData()
    {
        return fileData;
    }

    public void setFileData(CommonsMultipartFile fileData)
    {
        this.fileData = fileData;
    }

}

보기 - /upload.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>Test File Upload</title>
    </head>
    <body>
        <h1>Select a file to upload</h1>
        <c:if test="${not empty errors}">
            <h2 style="color:red;">${errors}.</h2>
        </c:if>
        <form:form modelAttribute="uploadedFile" method="post" enctype="multipart/form-data" name="uploadedFileform" id="uploadedFileform">
            <table width="600" border="0" align="left" cellpadding="0" cellspacing="0" id="pdf_upload_form">
                <tr>
                    <td width="180"><label class="title">Title:</label></td>
                    <td width="420"><form:input id="title" path="title" cssClass="areaInput" size="30" maxlength="128"/></td>
                </tr>
                <tr>
                    <td width="180"><label class="title">File:</label></td>
                    <td width="420"><form:input id="fileData" path="fileData" type="file" /></td>
                 </tr>
                 <tr>
                    <td width="180"></td>
                    <td width="420"><input type="submit" value="Upload File" /></td>
                 </tr>
            </table>
        </form:form>
    </body>
</html>

컨트롤러 - FileUploadController.java: package com.mypkg.controller;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.mypkg.models.UploadedFile;

@Controller
public class FileUploadController  implements HandlerExceptionResolver
{
    @RequestMapping(value = "/upload", method = RequestMethod.GET)
    public String getUploadForm(Model model)
    {
        model.addAttribute("uploadedFile", new UploadedFile());
        return "/upload";
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String create(UploadedFile uploadedFile, BindingResult result)
    {
        // Do something with the file
        System.out.println("#########  File Uploaded with Title: " + uploadedFile.getTitle());
        System.out.println("#########  Creating local file: /var/test-file-upload/" + uploadedFile.getFileData().getOriginalFilename());

        try
        {

            InputStream in = uploadedFile.getFileData().getInputStream();
            FileOutputStream f = new FileOutputStream(
                    "/var/test-file-upload/" + uploadedFile.getFileData().getOriginalFilename());
            int ch = 0;
            while ((ch = in.read()) != -1)
            {
                f.write(ch);
            }
            f.flush();
            f.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return "redirect:/";
    }

    /*** Trap Exceptions during the upload and show errors back in view form ***/
    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("errors", exception.getMessage());
        } else
        {
            model.put("errors", "Unexpected error: " + exception.getMessage());
        }
        model.put("uploadedFile", new UploadedFile());
        return new ModelAndView("/upload", model);
    }

}

========================================================================

이 문제를 해결해줘서 고마워요, 스티브.나는 몇 시간 동안 해결하려고 빈둥빈둥 놀았습니다.

핵심은 컨트롤러를 구현하는 것입니다.HandlerExceptionResolver추가합니다.resolveException방법.

--밥

컨트롤러 조언 사용

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ModelAndView handleMaxUploadException(MaxUploadSizeExceededException e, HttpServletRequest request, HttpServletResponse response){
        ModelAndView mav = new ModelAndView();
        boolean isJson = request.getRequestURL().toString().contains(".json");
        if (isJson) {
            mav.setView(new MappingJacksonJsonView());
            mav.addObject("result", "nok");
        }
        else mav.setViewName("uploadError");
        return mav;
    }
}

ajax를 사용하는 경우 json에 응답해야 하며 resolveException 메서드에서 json에 응답할 수 있습니다.

@Override
  public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
      Object handler, Exception ex) {
    ModelAndView view = new ModelAndView();
    view.setView(new MappingJacksonJsonView());
    APIResponseData apiResponseData = new APIResponseData();

    if (ex instanceof MaxUploadSizeExceededException) {
      apiResponseData.markFail("error message");
      view.addObject(apiResponseData);
      return view;
    }
    return null;
  }

언급URL : https://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception