Akka HTTP服务器接收包含其他字段的文件

时间:2017-10-31 05:14:17

标签: scala file-upload multipartform-data akka-http

我创建了一个小型Akka HTTP服务器来接收上传的文件。

path("upload"){
    uploadedFile("csv"){
        case (metadata, file) =>{
            println("file received " + file.length() );
            complete("hahahah")
        }
    }
}

我可以成功接收文件,但我无法访问此POST请求中的其他字段。字段"csv"包含要上载的文件,而另一个字段"name"包含用户定义的名称。我无法访问"name"中的数据。谁能给我一些关于如何获得它的线索?

1 个答案:

答案 0 :(得分:2)

您可以使用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