如何将Source [ByteString,Any]转换为InputStream

时间:2015-05-28 09:41:52

标签: scala akka akka-stream

akka-http表示使用multipart / form-data编码上传的文件Source[ByteString, Any]。我需要使用期望InputStream的Java库来解组它。

Source[ByteString, Any]如何变成InputStream

3 个答案:

答案 0 :(得分:22)

从版本2.x开始,您可以使用以下代码实现此目的:

import akka.stream.scaladsl.StreamConverters
...
val inputStream: InputStream = entity.dataBytes
        .runWith(
           StreamConverters.asInputStream(FiniteDuration(3, TimeUnit.SECONDS))
        )

请参阅:http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.1/scala/migration-guide-1.0-2.x-scala.html

注意:在版本2.0.2中被破坏并在2.4.2中修复

答案 1 :(得分:7)

您可以尝试使用写入OutputStreamSink的{​​{1}}并将其提供给您的其他代码用作其输入流的PipedOutputStream。这个想法有点粗糙,但它可以奏效。代码如下所示:

PipedInputStream

答案 2 :(得分:1)

您可以从ByteString中提取一个interator,然后获取InputStream。像这样的东西(伪代码):

source.map { data: ByteString =>
  data.iterator.asInputStream
}

<强>更新

以Multipart.FormData

开头的更详细的示例
def isSourceFromFormData(formData: Multipart.FormData): Source[InputStream, Any] = 
 formData.parts.map { part => 
   part.entity.dataBytes
   .map(_.iterator.asInputStream)
}.flatten(FlattenStrategy.concat)