2017-10-31 1 views
2

Ich habe einen kleinen Akka HTTP Server erstellt, um eine hochgeladene Datei zu erhalten.Akka HTTP Server empfängt Datei mit anderen Feldern

Ich kann die Datei erfolgreich empfangen, aber ich kann nicht auf andere Felder in dieser POST-Anfrage zugreifen. Das Feld "csv" enthält die Datei, die hochgeladen werden soll, während das andere Feld "name" den benutzerdefinierten Namen enthält. Ich kann auf die Daten in "name" nicht zugreifen. Kann mir jemand Hinweise geben, wie man es bekommt?

Antwort

1

Sie können fromFields('user) verwenden, um den Benutzernamen zu erhalten. Aber leider werden Sie diese Ausnahme erhalten: java.lang.IllegalStateException: Substream Source cannot be materialized more than once Es ist bekannt, Ausgabe: https://github.com/akka/akka-http/issues/90

Als Abhilfe können Sie verwenden toStrictEntity Richtlinie:

toStrictEntity(3.seconds) { 
    formFields('user) { (user) => 
    uploadedFile("csv") { 
     case (metadata, file) => { 
     println(s"file received by $user" + file.length()) 
      complete("hahahah") 
     } 
     } 
    } 
    } 
} 

Ich glaube nicht, es ist eine gute Idee, weil Sie die gesamte Meldung lesen Entity in den Speicher und es funktioniert, wenn Sie die kleine Entität haben.

Als bessere Lösung, können Sie Ihre eigene uploadedFile Richtlinie umzusetzen, die benötigten Teile und Felder aus Ihrer mehrteiliger Formulardaten extrahieren, uploadedFile Quellcode als Beispiel sehen: https://github.com/akka/akka-http/blob/v10.0.10/akka-http/src/main/scala/akka/http/scaladsl/server/directives/FileUploadDirectives.scala

+0

Vielen Dank! Es löst mein Problem perfekt. – Xinlong