首页 > 解决方案 > 当 REST API 返回较大的响应时,为什么 Chrome 会关闭连接?

问题描述

我使用这个 REST API

@GET
@Path("/get-file")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public void getFile(@Context HttpServletRequest request, @Context HttpServletResponse response, 
        @QueryParam("filePath") String filePath, @QueryParam("fileName") String fileName) throws IOException {fileName);
    File fileToDownload = new File(filePath);
    if (fileToDownload.exists()) {
        java.nio.file.Path path = Paths.get(fileToDownload.toURI());
        
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName);
        
        try {
            response.setHeader(HttpHeaders.CONTENT_LENGTH, Long.toString(Files.size(path)));
            
            Files.copy(path, response.getOutputStream());
            response.flushBuffer();
        } catch (IOException e) {
            log.error(e.getLocalizedMessage(), e);
            throw e;
        }
    } else {
        throw new FileNotFoundException();
    }
}

下载从服务器生成的文件。如果我尝试获取的文件小于 50GB(或多或少),一切正常,但是当我尝试在使用 Chrome 时下载 50GB 时,我得到一个java.net.SocketException: Connection reset例外。这在 Firefox 中不会发生,我可以像往常一样获取文件。

这是我在 Chrome 网络选项卡中看到的内容:

Chrome 网络标签

下载文件是我做的唯一操作,它立即失败。如果我从响应中省略CONTENT_LENGTH标头,响应的大小达到 48GB~ 然后我得到同样的错误。

有人对此有任何线索吗?在服务器端我使用 Java 7(我也尝试使用 Java 8),在客户端我使用 AngularJS v1.5.11。我使用 ApacheTomcat 来部署我的应用程序。如果您需要有关该问题的更多信息,请告诉我。

标签: javagoogle-chromenetworkingdownload

解决方案


推荐阅读