Scala AKKA Http多部分表单提取数据和文件
服务器接收包含文件和JSON对象的多部分表单。从请求中提取文件以及元数据和附加JSON对象的最佳方法是什么? 现在我有以下代码:Scala AKKA Http多部分表单提取数据和文件,scala,multipartform-data,akka-http,Scala,Multipartform Data,Akka Http,服务器接收包含文件和JSON对象的多部分表单。从请求中提取文件以及元数据和附加JSON对象的最佳方法是什么? 现在我有以下代码: pathPrefix(""){ post { extractRequestContext { requestCtx => { implicit val materializer = requestCtx.materializer implicit val executionContext = req
pathPrefix(""){
post {
extractRequestContext {
requestCtx => {
implicit val materializer = requestCtx.materializer
implicit val executionContext = requestCtx.executionContext
fileUpload("file") {
case (metadata, byteSource) => {
byteSource.runWith(FileIO.toPath(Paths.get(metadata.fileName))).onComplete {
case Success(posts) => {
formFields('campaign){
campaign => {
println(campaign)
complete(ApiResponse("OK"))
}
}}}
complete(ApiResponse("OK"))
}
}
}
}
}
}
问题是AKKA在完全读取请求之前发送响应。我不知道如何从这里完成路线:
byteSource.runWith(FileIO.toPath(Paths.get(metadata.fileName))) ...
这个表达式产生了IOResult,我怎样才能将它转换成一个server.Route?我想这里有两个独立的问题: 如何提取JSON和文件? 例如,如果您的请求如下:
curl -X POST "http://localhost/" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "metadata={ "key": "value" }" -F "attachment=image.png;type=image/png"
在元数据
字段中定义了JSON。你就是这样做的
import akka.http.scaladsl.server.Directives._
path("") {
post {
extractRequestContext { ctx =>
implicit val materializer = ctx.materializer
formField('metadata) { metadata =>
fileUpload("attachment") {
case (fileInfo, byteSource) =>
...
}
}
}
}
}
JSON对象被提取为字符串,您可以序列化回JSON对象
使用IOResult完成路线
问题实际上在于Scala的onComplete
,因为它返回一个单位
您可以这样做:
fileUpload("attachment") {
case (metadata, byteSource) =>
onComplete(byteSource.runWith(FileIO.toPath(Paths.get(metadata.fileName)))) {
case Success(value) => complete("OK")
case Failure(exception) => complete("NOT OK")
}
}
此onComplete来自包
akka.http.scaladsl.server.Directives
您能准确地指定您想要的吗?我知道它不是你想要的,但你想要什么还不清楚。我补充了更多细节