Hier ist was ich mache. 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.Asynchroner Datei-Upload im Frühjahr
Ich verwende den CommonsMultipartResolver, um die Anfrage zu bearbeiten, und ich habe das ResolveLazily-Flag auf True festgelegt, damit das Multipart nicht sofort aufgelöst wird.
hier ist also etwas entlang der Linien von dem, was ich habe
@Controller
public class myController{
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public String upload(MultipartHttpServletRequest request, String fileName){
String ticket = dao.createUploadTicket(fileName);
Runnable run = new Runnable(){
@Override
public void run(){
dao.writeUpdate(ticket, "Getting data from request");
final MultipartFile file = request.getFile("theFile");
dao.writeUpdate(ticket, "Multipart file processed");
try {
dao.writeUpdate(ticket, "Saving file to disk");
file.transferTo(new File("/myDirectory"));
dao.writeUpdate(ticket, "File saved to disk");
}
catch(Exception e){
dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString());
}
}
};
Thread t = new Thread(run);
t.start();
return ticket;
}
}
Also hier der Punkt ist, dass die Ticket-Nummer verwendet werden kann, um die Fortschritte Updates 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ückerhalten. 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 ticket-Nummern, dann zeigt eine Live-Ansicht aller Dateiuploads, die auf dem Server stattfinden.
Ich konnte dies nicht zum Funktionieren bringen, weil Spring, sobald der Controller zurückkehrt, cleanupMultipart() im CommonsMultipartResolver aufruft. 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.
Wer hat irgendwelche Ideen? Repariere ich hier irgendeine Art von HTTP-Vertrag, indem ich eine asynchrone Backend-Dateiverarbeitung durchführen möchte.
Commention auf meinem eigenen Beitrag. Ich habe die folgenden Blogs gefunden, die helfen könnten, eine Lösung zu finden. http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/ https://blogs.oracle.com/ enterprisetechnts/entry/asynchronous_support_in_servlet_3 Ich poste zurück, wenn ich mit einem Arbeitsbeispiel komme. – CAL5101