2016-09-05 8 views
1

私はWSコールでマルチパートフォームデータを送信したいと思います。私は、要求を変換するためにWritableを書き込もうとしましたが、結局、要求されたホスト上に空のボディを受け取りました。 Writableを修正する手助けをしてください。ここに私のコードです:Play Framework 2.5 WSポストmultipartform-data書き込み可能

object MultipartFormDataWritable { 
    val boundary = "----WebKitFormBoundary6s35viDB522LDEZQ" 

    def formatDataParts(data: Map[String, Seq[String]]) = { 
    val dataParts = data.flatMap { case (key, values) => 
     values.map { value => 
     val name = s""""$key"""" 
     s"--$boundary\r\n${HeaderNames.CONTENT_DISPOSITION}: form-data; name=$name\r\n\r\n$value\r\n" 
     } 
    }.mkString("") 
    Codec.utf_8.encode(dataParts) 
    } 

    def filePartHeader(file: FilePart[TemporaryFile]) = { 
    val name = s""""${file.key}"""" 
    val filename = s""""${file.filename}"""" 
    val contentType = file.contentType.map { ct => 
     s"${HeaderNames.CONTENT_TYPE}: $ct\r\n" 
    }.getOrElse("") 
    Codec.utf_8.encode(s"--$boundary\r\n${HeaderNames.CONTENT_DISPOSITION}: form-data; name=$name; filename=$filename\r\n$contentType\r\n") 
    } 

    val singleton = Writeable[MultipartFormData[TemporaryFile]](
    transform = { form: MultipartFormData[TemporaryFile] => 
     formatDataParts(form.dataParts) ++ 
     form.files.flatMap { file => 
      val fileBytes = Files.readAllBytes(Paths.get(file.ref.file.getAbsolutePath)) 
      filePartHeader(file) ++ fileBytes ++ Codec.utf_8.encode("\r\n") 
     } ++ 
     Codec.utf_8.encode(s"--$boundary--") 
    }, 
    contentType = Some(s"multipart/form-data; boundary=$boundary") 
) 
} 

答えて

0

あなたは単にこれをやっていない理由はありますか?

ws.url(url).post(Source(FilePart("hello", "hello.txt", Option("text/plain"), FileIO.fromFile(tmpFile)) :: DataPart("key", "value") :: List())) 

https://www.playframework.com/documentation/2.5.x/ScalaWS#submitting-multipart-form-data

+0

私のコードは、プロキシとして働く要求を受信して​​、いくつかのヘッダーの更新を指示する。..だから、それはない唯一のカスタマイズされた要求のために働いて参照してください。私は暗黙のうちにすべてのボディタイプをサポートするように変換しようとしています –

関連する問題