gpt4 book ai didi

scala - 使用 Akka HTTP 上传文件

转载 作者:行者123 更新时间:2023-12-02 20:02:57 24 4
gpt4 key购买 nike

我正在尝试使用 Akka HTTP 在我的应用程序中实现文件上传功能。我正在使用 akka-stream 版本 2.4.4

这是代码(修改自 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")
}*/
}
}
}
}
}

此代码工作正常,正在将文件上传到给定路径。我通过附加 UUID 来生成新文件名,以确保文件名是唯一的。所以我需要将新的文件名返回给调用者。但是,此方法并不总是返回文件名。有时,它会以响应没有内容结束。

谁能告诉我我在这里做错了什么?

最佳答案

当您有用于此目的的 react 流时,无需使用标准阻塞流:

  path("fileUpload") {
post {
fileUpload("fileUpload") {
case (fileInfo, fileStream) =>
val sink = FileIO.toPath(Paths.get("/tmp") resolve fileInfo.fileName)
val writeResult = fileStream.runWith(sink)
onSuccess(writeResult) { result =>
result.status match {
case Success(_) => complete(s"Successfully written ${result.count} bytes")
case Failure(e) => throw e
}
}
}
}
}

此代码会将 fileUpload 多部分字段上传到 /tmp 目录中的文件。它只是将输入源的内容转储到相应的文件接收器,并在写入操作完成后返回一条消息。

您可能还想调整用于 FileIO 源和接收器的调度程序,如 their scaladocs 中所述。 .

关于scala - 使用 Akka HTTP 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37430141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com