Jak radzić sobie z MaxUploadSizeExceededException
MaxUploadSizeExceededException
wyjątek pojawia się, gdy przesyłam plik, którego rozmiar przekracza maksymalną dozwoloną wielkość. Chcę wyświetlić komunikat o błędzie, gdy pojawi się ten wyjątek(np. komunikat o błędzie walidacji). Jak mogę poradzić sobie z tym wyjątkiem, aby zrobić coś takiego wiosną 3?
5 answers
W końcu wymyśliłem rozwiązanie, które działa przy użyciu HandlerExceptionResolver.
Dodawanie funkcji wieloczęściowych do konfiguracji sprężyny :
<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>
Model-UploadedFile.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;
}
}
View- / 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>
Controller-Kontroler Plików.java : pakiet com.mypkg.Kontrolery;
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);
}
}
========================================================================
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-05 20:41:08
To jest stare pytanie, więc dodaję je dla przyszłych ludzi (w tym przyszłych mnie), którzy walczą o to, aby to działało z Spring Boot 2 .
Najpierw należy skonfigurować aplikację spring (w pliku właściwości):
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
Jeśli używasz wbudowanego programu Tomcat (i najprawdopodobniej tak jest, ponieważ jest standardowo), ważne jest również skonfigurowanie programu Tomcat, aby nie anulował żądania za pomocą dużej zawartości
server.tomcat.max-swallow-size=-1
Lub przynajmniej ustawić go na stosunkowo duży rozmiar
server.tomcat.max-swallow-size=100MB
Jeśli nie ustawisz maxSwallowSize dla Tomcat, możesz zmarnować wiele godzin na debugowanie, dlaczego błąd jest obsługiwany, ale przeglądarka nie otrzymuje odpowiedzi - to dlatego, że bez tej konfiguracji Tomcat anuluje żądanie i nawet jeśli zobaczysz w dziennikach, że aplikacja obsługuje błąd, przeglądarka już otrzymała anulowanie żądania od Tomcat i nie słucha już odpowiedzi.
I do obsługi MaxUploadSizeExceededException możesz dodać Controlleravice z ExceptionHandler .
Oto szybki przykład w Kotlinie, który po prostu ustawia atrybut flash z błędem i przekierowuje do jakiejś strony:
@ControllerAdvice
class FileSizeExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException::class)
fun handleFileSizeException(
e: MaxUploadSizeExceededException,
redirectAttributes: RedirectAttributes
): String {
redirectAttributes.addFlashAttribute("error", "File is too big")
return "redirect:/"
}
}
Uwaga: Jeśli chcesz obsługiwać Maxupload Expceededexception z ExceptionHandler bezpośrednio w klasie kontrolera, powinieneś skonfigurować następującą właściwość:
spring.servlet.multipart.resolve-lazily=true
W Przeciwnym Razie ten wyjątek zostanie wywołany zanim żądanie zostanie zmapowany do kontrolera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-28 16:03:45
Dzięki za rozwiązanie tego Steve ' a. Bzykałem się próbując rozwiązać przez kilka godzin.
Kluczem jest zaimplementowanie kontrolera HandlerExceptionResolver
i dodanie metody resolveException
.
-- Bob
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-17 11:45:47
Użyj porady kontrolera
@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;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 01:54:53
Jeśli używasz ajax, musisz odpowiedzieć json, możesz odpowiedzieć json w metodzie resolveException
@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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 07:05:07