2016-12-14 1 views
3

기본적으로 사용자가 서버에서 CSV 파일을 다운로드 할 수있게하려고합니다. CSV 파일이 이미 서버에 있다고 가정합니다. API 엔드 포인트는 GET/export를 통해 공개됩니다. Akka HTTP 서버에서 클라이언트로 파일을 스트리밍하려면 어떻게해야합니까? 이 ... 나는 지금까지 무엇을 가지고Akka를 사용하여 서버에서 클라이언트로 파일 스트리밍

서비스 :

def export(): Future[IOResult] = { 
    FileIO.fromPath(Paths.get("file.csv")) 
     .to(Sink.ignore) 
     .run() 
} 

경로 :

pathPrefix("export") { 
    pathEndOrSingleSlash { 
    get { 
     complete(HttpEntity(ContentTypes.`text/csv`, export()) 
    } 
    } 
} 

답변

4

Akka - 스트림 API 그래서, 당신이 Source[ByteString, _]에서 직접 개체를 만들 수 있습니다

pathPrefix("export") { 
    pathEndOrSingleSlash { 
    get { 
     complete(HttpEntity(ContentTypes.`text/csv(UTF-8)`, FileIO.fromPath(Paths.get("file.csv"))) 
    } 
    } 
} 

이 방법을 사용하면 서버 코드가 필요하지 않습니다. 전체 CSV 파일을 메모리에 저장하여 전송합니다. 파일 내용은 배압이 가능한 스트림으로 전송됩니다. 이것에 대한 자세한 내용은 here.

+0

고마워요! 나에게 다음 단계는 서버에 임시 파일을 먼저 만들지 않고 행을 쓰면 클라이언트에 파일을 스트리밍하는 것입니다. – perry

+0

@perry 다음에했던 것에 대해 접근 방식을 알려주실 수 있습니까? 여기서'things'는 a TableQuery입니다. – oblivion

+1

'def things() : Source [ByteString, _] = Source.fromPublisher (db.stream (things.result.transactionally.withStatementParameters (fetchSize = 1000))) – perry

관련 문제