Преобразуйте Source[Array[Byte], NotUsed]
в a Source[ByteString, NotUsed]
и используйте HttpEntity
с ContentTypes
:
application/octet-stream
Здесь я использую ContentType.Binary
в качестве примера. Поскольку вы передаете видео, вам может потребоваться использовать complete(HttpEntity(ContentType.Binary(MediaTypes.`video/mpeg`), source))
соответствующий тип медиа . Например:
getShards
Обращаясь к вашему комментарию и обновлению, кажется, что вы хотите объединить результаты фьючерсов в flatMap
: как вы обнаружили, Future.reduceLeft
не делает этого. Используйте def getShards(id: String, shards: Int): Future[Array[Byte]] = { val futures = (1 to shards).map(Database.ShardModel.find(id, _)) Future.reduceLeft(futures)(_ ++ _) }
вместо этого:
getShards
В качестве альтернативы вместо объединения результатов в один массив вы можете переопределить Future[List[Array[Byte]]]
для возврата a Source
, а затем создать Source
использование flatMapConcat
:
def getShards(id: String, shards: Int): Future[List[Array[Byte]]] = {
val futures = (1 to shards).map(Database.ShardModel.find(id, _)).toList
Future.sequence(futures)
}
def getAsset = get {
pathPrefix("asset") {
parameters('id) { id =>
val f = mediaService.getMetadata(id).flatMap { x =>
mediaService.getShards(id, x.shards)
}
val source =
Source.fromFuture(f)
.flatMapConcat(Source.apply)
.map(ByteString.apply)
complete(HttpEntity(/* a content type */, source))
}
}
}