2017-11-18 4 views
0

http4sライブラリを使用してマルチパートコンテンツを処理するにはどうすればいいですか?http4sでのマルチパートコンテンツの処理

は(完全な要旨はhereである)次のスニペットを使用してサービスを想像してみて:

case GET -> Root/"form" => 
    Ok(
    """|<html> 
     |<body> 
     |<form method="post" action="/post" enctype="multipart/form-data"> 
     | <input type="date" name="birthDate" placeholder="birthDate"> 
     | <input type="file" name="dataFile"> 
     | <input type="submit"> 
     |</form></body></html>""".stripMargin). 
     withContentType(Some(`Content-Type`(`text/html`))) 

case req @ POST -> Root/"post" => { 
req.decode[Multipart[IO]] { m => 
    Ok(
    s"""Multipart Data\nParts:${m.parts.length} 
     |${m.parts.map { case f: Part[IO] => { f.name + ", headers: " + f.headers.mkString(",")} }.mkString("\n")}""".stripMargin) 
} 
    } 

私はサービスを実行し、対応するフィールドを記入した場合、私は次のような出力を得る:

Multipart Data 
Parts:2 
Some(birthDate), headers: Content-Disposition: form-data; name="birthDate" 
Some(dataFile), headers: Content-Disposition: form-data; name="dataFile"; 
filename="file.pdf",Content-Type: application/pdf 

したがって、Part[IO]タイプの要素で、headersbodyの要素を取得する方法を知っています。

これらの部分の処理方法を知りたいと思っています。この場合、たとえば、ファイルを開き、その長さを通知したいと思います。それを行う慣用方法は何ですか?

答えて

0

は、Stream[F[_],Byte]であり、fs2ライブラリーの方法を用いて処理することができる。

いくつかの可能性がありますが、1つの方法は、io.file.writeAllio.file.writeAllASyncメソッドを使用してストリームの内容をファイルに書き込むことです。

ストリングベースのファイルにも作用する別の可能性は、utf8Decodeメソッドを使用してストリームのコンテンツを処理することです。

結果は次のようになります。

case req @ POST -> Root/"post" => { 
    req.decode[Multipart[IO]] { m => { 
     m.parts.find(_.name == Some("dataFile")) match { 
     case None => BadRequest(s"Not file") 
     case Some(part) => for { 
      contents <- part.body.through(utf8Decode).runFoldMonoid 
      response <- Ok(s"""Multipart Data\nParts:${m.parts.length} 
          |File contents: ${contents}""".stripMargin) 
     } yield response 
     } 
    } 
    } 
    } 
} 

前のスニペットは、ファイルの内容を返します。

+0

以前の解決策の1つの問題は、ファイルが大きすぎる場合です。 – Labra

関連する問題