MaxUploadSizeExceededException im Frühling

MaxUploadSizeExceededException im Frühjahr

1. Überblick

Im Spring-Framework wird einMaxUploadSizeExceededException ausgelöst, wenn eine Anwendung versucht, eine Datei hochzuladen, deren Größe einen bestimmten in der Konfiguration angegebenen Schwellenwert überschreitet.

In diesem Tutorial sehen wir uns an, wie Sie eine maximale Upload-Größe festlegen. Anschließend zeigen wir einen einfachen Datei-Upload-Controller und erläutern verschiedene Methoden zur Behandlung dieser Ausnahme.

2. Festlegen einer maximalen Upload-Größe

Standardmäßig ist die Größe der Dateien, die hochgeladen werden können, nicht begrenzt. Um eine maximale Upload-Größe festzulegen, müssen Sie eine Bean vom TypMultipartResolver deklarieren.

Sehen wir uns ein Beispiel an, das die Dateigröße auf 5 MB begrenzt:

@Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver
      = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(5242880);
    return multipartResolver;
}

3. Datei-Upload-Controller

Als Nächstes definieren wir eine Controller-Methode, die das Hochladen und Speichern einer Datei auf den Server übernimmt:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(MultipartFile file) throws IOException {

    ModelAndView modelAndView = new ModelAndView("file");
    InputStream in = file.getInputStream();
    File currDir = new File(".");
    String path = currDir.getAbsolutePath();
    FileOutputStream f = new FileOutputStream(
      path.substring(0, path.length()-1)+ file.getOriginalFilename());
    int ch = 0;
    while ((ch = in.read()) != -1) {
        f.write(ch);
    }

    f.flush();
    f.close();

    modelAndView.getModel().put("message", "File uploaded successfully!");
    return modelAndView;
}

Wenn der Benutzer versucht, eine Datei mit einer Größe von mehr als 5 MB hochzuladen, löst die Anwendung eine Ausnahme vom TypMaxUploadSizeExceededException aus.

4. Umgang mitMaxUploadSizeExceededException

Um diese Ausnahme zu behandeln, kann unser Controller die SchnittstelleHandlerExceptionResolver implementieren oder eine mit Anmerkungen versehene Klasse@ControllerAdvice erstellen.

4.1. HandlerExceptionResolver implementieren

DieHandlerExceptionResolver-Schnittstelle deklariert eine Methode namensresolveException(), bei der Ausnahmen verschiedener Typen behandelt werden können.

Überschreiben wir die MethoderesolveException(), um eine Nachricht anzuzeigen, falls die abgefangene Ausnahme vom TypMaxUploadSizeExceededException ist:

@Override
public ModelAndView resolveException(
  HttpServletRequest request,
  HttpServletResponse response,
  Object object,
  Exception exc) {

    ModelAndView modelAndView = new ModelAndView("file");
    if (exc instanceof MaxUploadSizeExceededException) {
        modelAndView.getModel().put("message", "File size exceeds limit!");
    }
    return modelAndView;
}

4.2. Erstellen eines Controller Advice Interceptor

Es gibt eine Reihe von Vorteilen, wenn die Ausnahme über einen Interceptor und nicht im Controller selbst behandelt wird. Zum einen können wir dieselbe Ausnahmebehandlungslogik auf mehrere Controller anwenden.

Zum anderen können wir eine Methode erstellen, die nur auf die Ausnahme abzielt, die wir behandeln möchten, sodass das Framework die Ausnahmebehandlung delegieren kann, ohneinstanceof verwenden zu müssen, um zu überprüfen, welcher Ausnahmetyp ausgelöst wurde:

@ControllerAdvice
public class FileUploadExceptionAdvice {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ModelAndView handleMaxSizeException(
      MaxUploadSizeExceededException exc,
      HttpServletRequest request,
      HttpServletResponse response) {

        ModelAndView modelAndView = new ModelAndView("file");
        modelAndView.getModel().put("message", "File too large!");
        return modelAndView;
    }
}

5. Tomcat-Konfiguration

Wenn Sie auf Tomcat Server Version 7 und höher bereitstellen, gibt es eine Konfigurationseigenschaft namensmaxSwallowSize, die Sie möglicherweise festlegen oder ändern müssen.

Diese Eigenschaft gibt die maximale Anzahl von Bytes an, die Tomcat für einen Upload vom Client "verschluckt", wenn bekannt ist, dass der Server die Datei ignoriert.

Der Standardwert der Eigenschaft ist 2097152 (2 MB). Wenn Tomcat unverändert bleibt oder unter dem 5-MB-Grenzwert liegt, den wir inMultipartResolverfestgelegt haben, lehnt Tomcat jeden Versuch ab, eine Datei über 2 MB hochzuladen, und unsere benutzerdefinierte Ausnahmebehandlung wird niemals aufgerufen.

Damit die Anforderung erfolgreich ist und die Fehlermeldung der Anwendung angezeigt wird, müssen Sie die EigenschaftmaxSwallowSizeauf einen negativen Wert setzen. Dadurch wird Tomcat angewiesen, alle fehlgeschlagenen Uploads unabhängig von der Dateigröße zu verschlucken.

Dies erfolgt in der DateiTOMCAT_HOME/conf/server.xml:

6. Fazit

In diesem Artikel haben wir gezeigt, wie Sie im Frühjahr eine maximale Größe für das Hochladen von Dateien konfigurieren und wie Sie mitMaxUploadSizeExceededExceptionumgehen, wenn ein Client versucht, eine Datei hochzuladen, die diese Größenbeschränkung überschreitet.

Den vollständigen Quellcode für diesen Artikel finden Sie inGitHub project.