我是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"
)
答案 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。