[英]Needs to download big file in chunks
我有20 MB的文件。 我只想在浏览器中以块/流的形式下载文件,这样,如果有另一个请求,很长一段时间内不会被阻止。
我还在长文件中看到了暂停行为。 现在不需要。 如果有人因为我的好奇心想知道这是如何工作的,可以解释一下。
我已将文件保存在数据库中。 当我收到下载文件的请求时。 我将从DB获得文件。 我将字节代码推入响应主体并将其发送到浏览器。 在浏览器中,我创建了一个链接,并一次性下载了文件。
后端代码:
@GetMapping("/job-detail/{jobExecutionId}/file-detail")
public ResponseEntity<Resource> getFileDetail(@PathVariable final Long jobExecutionId) {
final FileDetailDto fileDetailDto =
fileTaskletService.getFileDetailByExecutionId(jobExecutionId);
return ResponseEntity.ok().contentType(new MediaType("text", "csv"))
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + fileDetailDto.getFileName() + "\"")
.body(new ByteArrayResource(fileDetailDto.getData()));
}
我想分块下载文件,以便其他请求也可以同时开始下载。
从问题的措辞看来,您希望服务器框架为您设置以下标头,以便数据以分块的形式流回:
Transfer-Encoding: chunked
为此,您需要提供一个Spring资源,其中事先不知道完整大小。 你已经使用ByteArrayResource
,其中全尺寸是已知的,在结果Content-Length
头中的响应设定和分块不被使用。
更改您的代码以使用InputStreamResource
,该服务将使用分块的传输编码将响应流传输回客户端,并且没有内容长度。 这是一个示例(未选中语法):
try(ByteArrayInputStream bis = new ByteArrayInputStream(fileDetailDto.getData())) {
return ResponseEntity.ok().contentType(new MediaType("text", "csv"))
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + fileDetailDto.getFileName() + "\"")
.body(new InputStreamResource(bis));
}
尽管这会给您带来分块的响应,但我不确定这不是浏览器问题的根源,因为无论服务器如何提供,它们都具有异步流回数据的能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.