Asynchroner Datei-Upload im Frühjahr

9

Hier mache ich was. Ich möchte mehrteilige Dateien über Ajax in meine Spring Web App hochladen. Wenn der Server die POST-Anforderung empfängt, erstellt er eine Ticketnummer in der Datenbank. Es startet dann einen Thread, der den eigentlichen Dateiupload behandelt. Der Server gibt dann die Ticketnummer zurück.

Ich verwende den CommonsMultipartResolver, um die Anfrage zu bearbeiten, und ich habe das resolveLazily-Flag auf "true" gesetzt, so dass das Multipart nicht sofort aufgelöst wird.

Hier ist also etwas in der Art, was ich habe

%Vor%

Also hier ist der Punkt, dass die Ticketnummer verwendet werden kann, um die Fortschrittsupdates zu erhalten. Angenommen, eine große Datei wird hochgeladen. Der Client, der den POST der Datei hochgeladen hat (in diesem Fall eine Ajax-Anfrage), kann dies asynchron tun und eine Ticketnummer zurückholen. Der Kunde kann diese Ticketnummer verwenden, um die Phase des Datei-Uploads zu bestimmen und Informationen auf einer anderen Seite anzuzeigen.

Eine andere Verwendung ist, dass ich eine HTML-Seite haben kann, die eine Anfrage an den Server für alle Ticketnummern stellt und dann eine "Live" -Ansicht aller Datei-Uploads zeigt, die auf dem Server stattfinden.

Ich konnte das nicht zum Laufen bringen, denn sobald der Controller zurückkehrt, ruft Spring cleanupMultipart () im CommonsMultipartResolver auf. Da das resolveLazily-Flag auf "false" gesetzt ist, wird beim Aufrufen von cleanupMultipart () damit begonnen, die mehrteiligen Dateien aufzulösen und zu initialisieren. Dies führt zu einer Wettlaufsituation zwischen dem Aufruf von "request.getFile (" theFile ");" in der Runnable und der cleanupMultipart () Aufruf führt schließlich zu einer Ausnahme.

Hat jemand Ideen? Mache ich hier irgendeine Art von HTTP-Vertrag, indem ich Back-End-asynchrone Dateiverarbeitung durchführen möchte.

    
CAL5101 18.05.2012, 23:27
quelle

1 Antwort

5

Die HTTP-Anfrage wird bereits in einem eigenen Thread ausgeführt, und der Client kann mehrere Anfragen asynchron parallel durchführen. Sie müssen also keinen neuen Thread starten. Speichern / bearbeiten Sie die Datei wie gewohnt im Hauptthread. Machen Sie ' asynchronen Datei-Upload nur auf der Client-Seite.

Außerdem sollten Sie http-Antworten nur senden, wenn Sie die Eingabe verarbeitet haben. Ich meine, Sie können den Eingabe-Header nicht lesen, eine HTTP-Antwort erstellen und weiterhin Daten aus dem Browser lesen. Eingabe verbrauchen - & gt; Verarbeiten Sie es - & gt; Senden Sie die Ausgabe, so wie die Protokolle HTTP 1 / 1.1 funktionieren.

Wenn Sie eine Ticketnummer zum Hochladen benötigen, können Sie sie vor dem eigentlichen Hochladen erstellen, indem Sie einen Upload in zwei Schritten wie:

verwenden
  • Ajax GET-Anfrage, um die Ticketnummer zu erhalten
  • POST einen Dateiinhalt und eine Ticketnummer (erhalten vom vorherigen Schritt)
  • + ajax GET erhält den aktuellen Status für das Ticket, jederzeit später, async
Igor Artamonov 13.06.2012, 05:53
quelle