Akka HTTP 服务器接收带有其他字段的文件
Akka HTTP server receives file with other fields
我创建了一个小型 Akka HTTP 服务器来接收上传的文件。
path("upload"){
uploadedFile("csv"){
case (metadata, file) =>{
println("file received " + file.length() );
complete("hahahah")
}
}
}
我可以成功接收文件,但我无法访问此 POST 请求中的其他字段。 "csv"
字段包含要上传的文件,而另一个字段 "name"
包含用户定义的名称。我无法访问 "name"
中的数据。谁能给我一些关于如何获得它的线索?
您可以使用fromFields('user)
获取用户名。但不幸的是你会得到这个例外:java.lang.IllegalStateException: Substream Source cannot be materialized more than once
这是一个已知问题:https://github.com/akka/akka-http/issues/90
作为解决方法,您可以使用 toStrictEntity
指令:
toStrictEntity(3.seconds) {
formFields('user) { (user) =>
uploadedFile("csv") {
case (metadata, file) => {
println(s"file received by $user" + file.length())
complete("hahahah")
}
}
}
}
}
我认为这不是个好主意,因为您会将整个请求实体读入内存,如果您有小实体,它就可以工作。
作为更好的解决方案,您可以实现自己的 uploadedFile
指令,该指令将从多部分表单数据中提取所需的部分和字段,请参见 uploadedFile
源代码示例:https://github.com/akka/akka-http/blob/v10.0.10/akka-http/src/main/scala/akka/http/scaladsl/server/directives/FileUploadDirectives.scala
我创建了一个小型 Akka HTTP 服务器来接收上传的文件。
path("upload"){
uploadedFile("csv"){
case (metadata, file) =>{
println("file received " + file.length() );
complete("hahahah")
}
}
}
我可以成功接收文件,但我无法访问此 POST 请求中的其他字段。 "csv"
字段包含要上传的文件,而另一个字段 "name"
包含用户定义的名称。我无法访问 "name"
中的数据。谁能给我一些关于如何获得它的线索?
您可以使用fromFields('user)
获取用户名。但不幸的是你会得到这个例外:java.lang.IllegalStateException: Substream Source cannot be materialized more than once
这是一个已知问题:https://github.com/akka/akka-http/issues/90
作为解决方法,您可以使用 toStrictEntity
指令:
toStrictEntity(3.seconds) {
formFields('user) { (user) =>
uploadedFile("csv") {
case (metadata, file) => {
println(s"file received by $user" + file.length())
complete("hahahah")
}
}
}
}
}
我认为这不是个好主意,因为您会将整个请求实体读入内存,如果您有小实体,它就可以工作。
作为更好的解决方案,您可以实现自己的 uploadedFile
指令,该指令将从多部分表单数据中提取所需的部分和字段,请参见 uploadedFile
源代码示例:https://github.com/akka/akka-http/blob/v10.0.10/akka-http/src/main/scala/akka/http/scaladsl/server/directives/FileUploadDirectives.scala