2017-10-31 8 views
2

アップロードしたファイルを受け取るために小さなAkka HTTPサーバーを作成しました。Akka HTTPサーバーは他のフィールドのファイルを受け取ります

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

ファイルを正常に受信できますが、このPOSTリクエストの他のフィールドにアクセスすることはできません。フィールド"csv"にはアップロードするファイルが含まれ、別のフィールドの"name"にはユーザー定義の名前が含まれます。 "name"のデータにアクセスできません。誰も私にそれを得る方法についての手がかりを与えることができますか?

答えて

1

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

+0

どうもありがとうございました!それは私の問題を完全に解決します。 – Xinlong

関連する問題