使用Play框架

时间:2018-01-08 15:33:38

标签: java playframework-2.0 java-stream

我有一个关于动态创建和流式传输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。任何帮助表示赞赏!

谢谢!

0 个答案:

没有答案