SizeLimitExceededException abfangen

Dimax

Top Contributor
Hallo Kollegen,

ich möchte alle Fehler beim Dateieinlesen abfangen ,das klappt aber nicht.
hier wird es eingelesen:
Code:
<FORM ENCTYPE="multipart/form-data" ACTION="addProg" METHOD=POST>
    <table style="border:none;margin-left: auto;margin-right: auto;" >
        <tbody>
            <tr>
                <td align="right">Einzulesende Datei: </td>
                <td align="left"><INPUT NAME="file" TYPE="file" class="file" required></td>       
            </tr>
            <tr><td></td></tr>
            <tr><td></td></tr>
            <tr>       
                <td align="right">Projekt-Name: </td>               
                <td align="left">
                    <select name="selectedId" size=1 class="standard">
                        <option th:each="el :${proj}" th:value="${el.projektId}"
                            th:text="${el.projektId}+'. '+${el.projekt}"></option>                   
                    </select><b><font color="red"> Falls kein Projekt zur Auswahl steht,
                        m&uuml;ssen Sie ein Projekt erstellen!</font></b>
                </td>
hier versuche ich die Fehler abzufangen:
Java:
Das ist Try Catch Block im Controller
try {
            if(!name.equals("txt")&&!name.equals("sas")&&!name.equals("sql")) {
                model.addAttribute("status",'c');
                model.addAttribute("site",3);
          
                return "/Fehler";
            }else {
                //System.out.println(">true<");
                }
            in = new DataInputStream(file.getInputStream());

            while (totalBytesRead < sizeFile) {

                byteRead = in.read(dataBytes, totalBytesRead, (int) sizeFile);

                totalBytesRead += byteRead;
            }
        } catch (Exception e) {
       
            if (e instanceof MaxUploadSizeExceededException) {
                model.addAttribute("status",'b');
                model.addAttribute("site",3);
                return "/Fehler";
            } 
System.out.println("Datei zu groß");
           ex.printStackTrace();
        }
Wie kann man diesen Fehler abfangen?->

org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (89047335) exceeds the configured maximum (83886080)
 
wo fliegt der Fehler denn überhaupt?
er fliegt wenn ich versuche eine größere Datei einzulesen im Block 1 und im Controller :
Java:
@PostMapping("/addProg")
    public String addProgToDb(@RequestPart Part file,
                              @RequestPart String selectedId,
                              @RequestParam (value="progra_name", required=false) String progra_name,
                              @RequestParam (value="pageName", required=false) String pageName,
                              Model model) throws IOException {....
versuche ich den Fehler abzufangen.
ich vermute, dass der Spring die Größe der Datei prüft bevor er sie weiterleitet und wirft den Fehler.
 
Das Problem ist ja, dass das Problem nicht in Deinem Code auftritt, sondern bei der Auswertung des Requests selbst.

Da sind also zum einen die Request Size, die bei Tomcat durch maxPostSize begrenzt ist (und was Du im Connector in der server.xml konfigurieren kannst).

Und auf Applikationsebene muss es bei multipart ebenfalls eingestellt werden! Was nutzt Du genau? Bei Spring Boot wären es dann z.B. die Einstellung von diesen Werten:
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
(Die 128KB sind natürlich viel zu kleine Werte ... Du bist ja bereits im MB Bereich - um 80MB wenn ich das richtig gesehen habe!)
 
Danke Jungs, ich brauche aber die Grenze nicht erhöhen, sie soll so bleiben wie sie ist, aber ich möchte den Fehler abzufangen um auf die Error Seite zu umleiten.
 
Mir fehlen immer noch die genauen Informationen, was Du alles nutzt um die Applikation zu bauen.

Generell Tomcat selbst: Wenn der Request zu groß ist, dann ist es ein "Bad Request" mit Status Code 400 und da kann man in der web.xml natürlich eine Fehlerseite angeben. Also etwas wie:
XML:
    <error-page>
        <error-code>400</error-code>
        <location>/error/RequestTooLarge.html</location>
    </error-page>
(Wobei ein 400 nicht nur bei zu großen Requests kommen kann... Aber erst einmal egal)

Wenn es im Framework selbst kommt, dann kennen die in der Regel Wege, wie die Exception behandelt werden kann. JAX-RS kennt z.B. ExceptionMapper und Du kannst dann eine Klasse schreiben, die @Provider hat und die ExceptionMapper<SizeLimitExceededException> implementiert. Exception Handling With Jersey | Baeldung

Das einfach nur als ein genereller Ausblick. Wichtig ist, dass Du drei Ebenen hast, wo das Problem auftreten kann:
  • Tomcat selbst bekommt einen ungültigen Request (weil der Request z.B. größer ist als erlaubt). Dann behandelt Tomcat den Fehler selbst und Deine Applikation bekommt nichts mit.
  • Dein benutztes Framework bekommt den Request von Tomcat und bearbeitet diesen und dabei tritt ein Fehler auf. Dann wirft das Framework den Fehler bzw. behandelt diesen.
  • Als letztes kommt es zu Deinem Code: Das Framework hat den Request auswerten können, hat über irgendwelche Routing Mechanismen den Endpoint / Controller identifiziert und konnte den Request entsprechend aufbereiten. In dem Fall wird dann Deine Methode aufgerufen und Du kannst aktiv etwas machen und dann auf Exceptions reagieren.

==> Es ist also klar, dass Du in Deinem Code nur auf Exceptions in Deinem Code reagieren kannst. Alles, was außerhalb statt findet, kannst Du erst einmal in dem reinen Controller nicht behandeln. Da muss man dann genau schauen, was für Möglichkeiten es gibt. Und bei der ersten Ebene wäre es die web.xml, die eine Fehlerseite definieren kann. Und beim Framework kommt es auf das Framework an.
 

Zurück
Oben