2016-12-14 1 views
3

В принципе, я хочу разрешить пользователю загружать csv-файл с сервера. Предположим, что файл CSV уже существует на сервере. Конечная точка API открывается через GET/export. Как я могу передать файл с HTTP-сервера Akka на клиент? Это то, что я до сих пор ...Поток файлов с сервера на клиент с помощью 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

Акка-Stream 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 Можете ли вы поделиться своим подходом с тем, что вы сделали дальше? – oblivion

+1

'def export(): Source [ByteString, _] = Source.fromPublisher (db.stream (things.result.transactionally.withStatementParameters (fetchSize = 1000)))' Где 'вещи' - это TableQuery – perry

Смежные вопросы