java - 当 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 网络选项卡中看到的内容:
下载文件是我做的唯一操作,它立即失败。如果我从响应中省略CONTENT_LENGTH
标头,响应的大小达到 48GB~ 然后我得到同样的错误。
有人对此有任何线索吗?在服务器端我使用 Java 7(我也尝试使用 Java 8),在客户端我使用 AngularJS v1.5.11。我使用 ApacheTomcat 来部署我的应用程序。如果您需要有关该问题的更多信息,请告诉我。
解决方案
推荐阅读
- couchdb - 在 .find() 中执行“$elemMatch”时的未知运算符“0”
- java - 将带有 Println 语句的 void 函数导出到 TextArea(JavaFx)
- wordpress - WordPress:分类档案中按帖子类型分开的帖子
- scala - 作业因阶段失败而中止:阶段 0.0 中的任务 0 失败 1 次,最近一次失败:SPARK 中的 java.io.EOFException
- regex - 正则表达式多行在 regexr 但不是 PowerShell
- c# - botbuilder v 4,动态自适应卡,带有下拉菜单并在提示时捕获值
- c# - 在 Core 2.1 中向现有的 Microsoft.Extensions.Logging.LoggerExtensions 添加方法
- api - 谷歌地理编码 API 返回错误的邮编/城市
- java - 在旋转和阻塞时间短或没有旋转和阻塞时间的安全点操作期间,什么可能导致非常高的同步时间?
- c - 传递参数以更改 #define 变量