2017-11-18 17 views
0

http4s 라이브러리를 사용하여 멀티 파트 콘텐츠를 처리하는 방법을 알고 싶습니다.http4의 멀티 파트 콘텐츠 처리

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 
: I는 서비스를 실행하고, 해당 필드를 채우는 경우

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) 
} 
    } 

는, I는 다음과 같은 결과를 얻었다 :

다음 코드와 서비스 (완전한 요지 here이다) 상상

그래서 Part[IO] 유형의 요소이며 headersbody을 포함하는 파트에 대한 정보를 얻는 방법을 알고 있습니다.

내가 원하는 것은 그 부분들을 어떻게 처리 하는지를 아는 것이다. 이 경우, 예를 들어 파일을 열고 그 길이를 알리고 싶습니다. 그 일을하는 관용적 인 방법은 무엇입니까?

답변

0

은 이고, 이는 fs2 라이브러리로부터의 방법을 사용하여 처리 될 수있다.

여러 가지 가능성이 있습니다. 한 가지 방법은 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

이전 솔루션의 한 가지 문제점은 파일이 너무 클 때입니다. – Labra