Problem mit Spring FileUpload

8

Ich habe den folgenden Codeblock, der meinen Dateiupload eines Fotos behandelt, das ich in meiner Spring MVC-Webanwendung verwende. Ich verwende Spring MVC CommonsMultipartFileResolver, um Dateiuploads zu verarbeiten.

%Vor%

In meiner app-servlet.xml-Datei habe ich den folgenden Code, um die MultipartFile-Resolver-Bean zu konfigurieren.

%Vor%

Beim Hochladen von Fotos treten einige zufällige Probleme auf.

1) Wenn ich ein kleineres Foto hochladen möchte, ungefähr 3 kb oder so, wird es erfolgreich hochgeladen.

2) Wenn ich ein etwas größeres Foto hochladen möchte, erstellt es die Datei im Verzeichnis, aber mit einer Größe von 0 Bytes und gibt die folgende Fehlermeldung aus.

%Vor%

Ich habe ein paar verschiedene Optionen ausprobiert, um den Multipart-Resolver so zu konfigurieren, dass er ein CommonsMultipartFile -Objekt als Gegensatz zu einem einfachen MultipartFile -Objekt behandelt, aber nichts geändert hat.

Ich habe auch versucht, die maximale Upload-Größe in der Bean CommonsMultipartFileResolver mit der folgenden Eigenschaft zu konfigurieren.

%Vor%

hat sich auch nichts geändert. Ich bin mir nicht sicher, was der CommonsMultipartResolver standardmäßig so weit wie die Größe der Datei, die hochgeladen werden kann, ist, aber das ist nicht meine Frage.

Mir wurde gesagt, dass das Problem, das ich erlebe, auf ein Problem im Multipart Parser / Handler zurückzuführen ist, den Spring verwendet. Ich hatte kürzlich einen Beitrag über das gleiche Problem, und weil neue Informationen gefunden wurden, wollte ich mit den neuen Informationen neu veröffentlichen. Der alte Beitrag kann unter CommonsMultipartFileResolver Problem

gefunden werden

Ich habe das Gefühl, dass ich fast jede Ressource im Internet überprüft habe, um zusätzliche Dokumentation zu finden, bin aber nicht in der Lage, das Problem zu lösen.

Bitte helfen Sie mir, herauszufinden, was hier vor sich geht, und ob es eine bessere einfachere Lösung gibt, um diese Optionen zu erforschen, aber ich würde lieber mit meiner derzeitigen Methode bleiben, wenn ich kann finde eine Lösung.

BEARBEITEN Hinweis: Ich habe mit Fotos unterschiedlicher Größe experimentiert, um sie hochzuladen, und ich glaube, dass das Limit, das ich hochladen darf, bei etwa 10 KB liegt. Alles, was größer ist als 10Kb, verursacht einen Bruch und gibt mir den obigen Fehler.

    
TheJediCowboy 19.09.2010, 20:53
quelle

3 Antworten

11

Nach vielen Recherchen habe ich mein Problem gelöst. Es stellt sich heraus, dass für die maximale Anzahl an Bytes, die Sie hochladen können, kein Standardlimit festgelegt ist. CommonsMultipartFileResolver Natürlich können Sie in Ihrer Bean für diesen Betrag festlegen, was Sie wollen, indem Sie die folgende Eigenschaft festlegen.

%Vor%

Es gibt auch eine Eigenschaft maxInMemorySize , mit der Sie die maximal zulässige Größe festlegen können, bevor Dateien auf die Festplatte geschrieben werden. Obwohl dies wie die maximale Upload-Größe funktioniert, werden standardmäßig 1024 Byte angegeben, wenn Sie keinen Betrag angeben. Das würde erklären, dass es bricht, wenn ich versuche, eine große Datei hochzuladen.

Damit Dateien mit mehr als 1024 Bytes hochgeladen werden können, müssen Sie den maxInMemorySize-Wert auf den Wert wie folgt erhöhen ...     

Das hat mein Problem gelöst. Ich habe gelernt, dass diese Eigenschaft standardmäßig 1024 ist, als ich die Dokumentation für CommonsFileUpload Dokumentation durchgesehen habe.

Sie können diese Dokumentation unter CommonsFileUpload-Dokumentation

Ich hoffe, dass dies jedem hilft, da es keine sehr gute Dokumentation über die Verwendung von CommonsMultipartFile gibt.

    
TheJediCowboy 19.09.2010, 22:55
quelle
3

Ich bemerke, dass dieser Fehler nur auftritt, wenn die Datei mehr als 1024 Bytes hat UND Sie versuchen, die Datei zweimal zu lesen . Wie CitadelCSAlum erwähnt, wird durch die Einstellung von maxInMemorySize = maxUploadSize dieses Problem behoben, aber die Speicherbelegung sollte berücksichtigt werden. Wenn Speicher ein Problem ist, besteht eine andere Möglichkeit darin, die mehrteiligen Dateidaten beim ersten Lesen in eine temporäre Datei zu schreiben und diese Datei für nachfolgende Lesevorgänge zu verwenden. Wenn Sie das nicht zweimal lesen, sollten Sie maxInMemorySize nicht erhöhen müssen.

    
splashout 05.02.2014 20:31
quelle
2

Die Ausnahme, auf die Sie in Ihrer Frage verweisen, besagt: "Datei wurde verschoben - kann nicht erneut gelesen werden". Dies liegt daran, dass wir versuchen, den Eingangsstrom mehr als einmal aus einer mehrteiligen Datei zu lesen.

Ich habe dieses Problem auch einmal gesehen, und in meinem Fall habe ich zuerst den Inhalt der Datei überprüft, und danach habe ich versucht, sie mit der "transferTo" -Methode in Spring MultiPart zu speichern. Diese Ausnahme kommt, wenn ich versuche, die Methode "transferTo" zu verwenden. Hier rufe ich zweimal Inputstream an.

Ich habe dieses Problem nicht, wenn die Dateigröße zu klein ist. Bei der Methode "transferTo" gibt es einen internen Aufruf für die Methode "isAvailable". Bitte folgen Sie dem Code-Segment:

%Vor%

Link: Ссылка

Beobachtungen:

  1. Wenn es zu klein ist, speichere es im Speicher und wenn wir nach der Datei fragen, wird es aus dem Speicher abgerufen. Wir können mehrmals darum bitten, weil die Datei im Speicher ist.

  2. Wenn es groß genug ist, speichert Spring es als eine temporäre Datei, von der wir den Speicherort nicht kennen, aber nachdem wir Inputstream einmal gelesen haben, kann diese Datei intern von Spring gelöscht werden. Dann, wenn wir zum zweiten Mal nach dem Fehler fragen, kann "Kann nicht wieder gelesen werden".

Also meine Lösung ist zuerst muss ich es in Server-Location speichern mit "TransferTo" -Methode und retrieve diese lokale Datei zu validieren oder andere zweite Mal brauchen.

Ich denke, es ist nicht gut, "maxUploadSize" in "multipartResolver" -Bee zu erhöhen, da es mehr Speicher verbraucht, wenn die Datei zu groß ist.

    
Arosha 21.06.2014 01:39
quelle