返回JGits git.archive()OutputStream作为枚举器

时间:2015-11-26 20:55:31

标签: git scala playframework zip jgit

我是Scala的新手,我正在尝试的是通过JGit压缩git存储库并提供压缩文件作为下载。 我们的想法是不会事先生成Zip-File,而是立即压缩并立即传输。我没有使用Jgit和类似示例https://gist.github.com/gre/4058734

的工作

但是,由于已经有一个将压缩存储库写入OutputStream的git.archive方法,我想用它代替上面的解决方案。 我尝试了以下但是它没有用,我似乎无法找出原因。

  ArchiveFormats.registerAll();

  var enum = Enumerator.outputStream { os =>   
    git.archive()
      .setTree(git.getRepository.resolve("master"))
      .setFormat("zip")
      .setOutputStream(os)
      .call() 
   }

  ArchiveFormats.unregisterAll();


 Ok.stream(enum >>> Enumerator.eof).withHeaders(
 "Content-Type"->"application/zip", 
 "Content-Disposition"->"attachment; filename=asdf.zip"
)

1 个答案:

答案 0 :(得分:2)

问题在于setOutputStream期待ByteArrayOutputStream,而不仅仅是outputStream

您可以将zip内容放入ByteArrayOutputStream,然后将其转换为InputStream,以便退回内容。

  ByteArrayOutputStream data= new ByteArrayOutputStream();

  git.archive()
      .setTree(git.getRepository.resolve("master"))
      .setFormat("zip")
      .setOutputStream(data)
      .call() 

  InputStream inStream = new ByteArrayInputStream(data.toByteArray());

  val dataContent: Enumerator[Array[Byte]] = Enumerator.fromStream(inStream)

  Ok.stream(dataContent).withHeaders(
     "Content-Type"->"application/zip", 
     "Content-Disposition"->"attachment; filename=asdf.zip"
  )

这里需要注意一些注意事项,上面的示例显示了如何解决问题中的问题,但需要注意内存工作量。

文档here涵盖了以块的形式发送大量数据的示例。

如果您正在寻求最高效率,有一些关于如何更有效地将ByteArrayOutputStream转换为ByteArrayInputStream的说明here