通过 Spring MVC 下载大文件

Ste*_*bbi 6 java spring spring-mvc

我有一个下载文件的休息方法。但是,在文件完全复制到输出流之前,似乎不会在 Web 客户端上开始下载,这对于大文件可能需要一段时间。

@GetMapping(value = "download-single-report")
public void downloadSingleReport(HttpServletResponse response) {

    File dlFile = new File("some_path");

    try {
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment; filename="+ dlFile.getName());
        InputStream inputStream = new FileInputStream(dlFile);
        IOUtils.copy(inputStream, response.getOutputStream());
        response.flushBuffer();
    } catch (FileNotFoundException e) {
        // error
    } catch (IOException e) {
        // error
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法“流式传输”文件,以便在我开始写入输出流时立即开始下载?

我还有一个类似的方法,它将多个文件放入一个 zip 文件中,将每个 zip 条目添加到 zip 流中,并且下载也仅在创建 zip 文件后才开始:

        ZipEntry zipEntry = new ZipEntry(entryName);
        zipOutStream.putNextEntry(zipEntry);
        IOUtils.copy(fileStream, zipOutStream);
Run Code Online (Sandbox Code Playgroud)

Sta*_*avL 0

使用

IOUtils.copyLarge(InputStream input, OutputStream output)
Run Code Online (Sandbox Code Playgroud)

将字节从大型(超过 2GB)输入流复制到输出流。此方法在内部缓冲输入,因此不需要使用 BufferedInputStream。

缓冲区大小由 DEFAULT_BUFFER_SIZE 给定。

或者

IOUtils.copyLarge(InputStream input, OutputStream output, byte[] buffer)
Run Code Online (Sandbox Code Playgroud)

将字节从大型(超过 2GB)输入流复制到输出流。此方法使用提供的缓冲区,因此不需要使用 BufferedInputStream。

http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html