Ich versuche, Datei-Upload-Funktionalität in meiner Anwendung mit Akka HTTP zu implementieren. Ich verwende akka-stream
Version 2.4.4
. HierDatei-Upload mit Akka HTTP
ist der Code (modifiziert nach akka-doc)
path("fileupload") {
post {
extractRequestContext {
ctx => {
implicit val materializer = ctx.materializer
implicit val ec = ctx.executionContext
fileUpload("fileUpload") {
case (metadata, byteSource) =>
val location = FileUtil.getUploadPath(metadata)
val updatedFileName = metadata.fileName.replaceAll(" ", "").replaceAll("\"", "")
val uniqFileName = uniqueFileId.concat(updatedFileName)
val fullPath = location + File.separator + uniqFileName
val writer = new FileOutputStream(fullPath)
val bufferedWriter = new BufferedOutputStream(writer)
val result = byteSource.map(s => {
bufferedWriter.write(s.toArray)
}).runWith(Sink.ignore)
val result1 = byteSource.runWith(Sink.foreach(s=>bufferedWriter.write(s.toArray)))
Await.result(result1, 5.seconds)
bufferedWriter.flush()
bufferedWriter.close()
complete(uniqFileName)
/*onSuccess(result) { x =>
bufferedWriter.flush()
bufferedWriter.close()
complete("hello world")
}*/
}
}
}
}
}
Dieser Code funktioniert gut und wird die Datei in den angegebenen Pfad hochladen. Ich erzeuge neue Dateinamen durch Anhängen von UUID, um sicherzustellen, dass die Dateinamen eindeutig sind. Also muss ich dem Anrufer den neuen Dateinamen zurückgeben. Diese Methode gibt jedoch den Dateinamen nicht immer zurück. Manchmal endet es mit Response has no content
.
Kann mir jemand sagen, was ich hier falsch mache?
Dies ist keine Antwort auf Ihre Frage, aber schauen Sie in http://doc.akka.io/docs/akka/2.4.6/scala/stream/stages-overview.html#file-io-sinks-and -quellen statt manuell in eine Datei zu schreiben. Auch das Verwenden von Await.result in einer Route ist wirklich ein schlechter Stil. –
Wird sich das ansehen. Ich habe versucht mit onSuccess statt Await, bust same. Also habe ich es mit Await versucht. Danke für die Antwort, lass mich den Link versuchen. –
@ RüdigerKlaehn Ich habe versucht mit FileIO, noch das gleiche Problem existiert :( –