Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala AKKA Http多部分表单提取数据和文件_Scala_Multipartform Data_Akka Http - Fatal编程技术网

Scala AKKA Http多部分表单提取数据和文件

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

服务器接收包含文件和JSON对象的多部分表单。从请求中提取文件以及元数据和附加JSON对象的最佳方法是什么? 现在我有以下代码:

    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

您能准确地指定您想要的吗?我知道它不是你想要的,但你想要什么还不清楚。我补充了更多细节