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)
使用
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