我有一个关于动态创建和流式传输ZIP文件的问题。我有多个大文件存储在远程HTTP服务器上(例如Amazon S3)。
现在我希望用户下载让我们说100个文件作为一个ZIP文件。
我可以下载所有100个文件,压缩它们并将它们流式传输给用户,但这会浪费大量资源。所以我的方法是下载第一个文件,将其传输给用户,下载下一个文件,将其流式传输给用户等等。
这是测试代码:
public class TestController extends Controller {
public Result test() throws Exception {
InputStream is = getDynamicStreamSomewhere();
response().setContentType("application/zip");
response().setHeader("Content-Disposition", "attachment;filename=test.zip");
return ok(is);
}
private InputStream getDynamicStreamSomewhere() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
String url1 = "http://www.example.com/largefile1.bin";
String url2 = "http://www.example.com/largefile2.bin";
ZipEntry entry1 = new ZipEntry("file1.bin");
zos.putNextEntry(entry1);
URL website = new URL(url2);
InputStream in = website.openStream();
IOUtils.copy(in, zos);
in.close();
zos.closeEntry();
ZipEntry entr2 = new ZipEntry("file2.bin");
zos.putNextEntry(entr2);
URL websitea = new URL(url1);
InputStream ina = websitea.openStream();
IOUtils.copy(ina, zos);
ina.close();
zos.closeEntry();
return new ByteArrayInputStream(baos.toByteArray());
}
}
但就我调试而言,这并不是真正按文件流式传输,而是下载所有内容然后将其流式传输给用户。
我缺少的是在每个文件之后(或者每个4KB块之后)将输出缓冲区刷新给用户。
我知道如何使用Java servlet,但不能使用Play Framework。任何帮助表示赞赏!
谢谢!