代码之家  ›  专栏  ›  技术社区  ›  Xinlong

Akka HTTP服务器接收带有其他字段的文件

  •  2
  • Xinlong  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Leonard    7 年前

    您可以使用 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 上载的文件 源代码示例: https://github.com/akka/akka-http/blob/v10.0.10/akka-http/src/main/scala/akka/http/scaladsl/server/directives/FileUploadDirectives.scala