Tôi đang cố triển khai chức năng tải lên tệp trong ứng dụng của mình bằng cách sử dụng Akka HTTP. Tôi đang sử dụng akka-stream
phiên bản 2.4.4
.Tải lên tệp bằng cách sử dụng Akka HTTP
Đây là mã (sửa đổi từ 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")
}*/
}
}
}
}
}
Mã này đang làm việc tốt và được tải lên các tập tin vào con đường đã chọn. Tôi đang tạo tên tệp mới bằng cách thêm UUID để đảm bảo rằng tên tệp là duy nhất. Vì vậy, tôi cần phải trả lại tên tập tin mới cho người gọi. Tuy nhiên, phương pháp này không trả lại tên tệp luôn. Đôi khi, nó kết thúc với Response has no content
.
Có ai cho tôi biết tôi đang làm gì sai ở đây không?
Đây không phải là câu trả lời cho câu hỏi của bạn, nhưng hãy xem http://doc.akka.io/docs/akka/2.4.6/scala/stream/stages-overview.html#file-io-sinks-and -source thay vì viết bằng tay vào một tập tin. Ngoài ra, bằng cách sử dụng Await.result bên trong một tuyến đường thực sự là phong cách xấu. –
Sẽ xem xét điều đó. Tôi đã thử với onSuccess thay vì Await, bust giống nhau. Vì vậy, tôi đã cố gắng với Await. Cảm ơn bạn đã trả lời, hãy để tôi thử liên kết. –
@ RüdigerKlaehn Tôi đã thử với FileIO, vẫn tồn tại cùng một vấn đề: ( –