繁体   English   中英

需要分块下载大文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM