解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

简介: 笔记

前言


前几天写了一个下载接口,当时用的uuid作为作为压缩包名称,需求觉得不妥,然后让换成从数据库里面查出来的某一段标题作为压缩包名称

换成中文之后呢,简单调试了下,我擦!报错了!1.png

赶紧去控制台查看日志

java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

2.png

发现并解决问题


此时我们的代码是这样的

    private void downloadFile(Long signId,Long docType, HttpServletResponse response) throws Exception {
        Sign sign = signMapper.selectById(signId);
        // 签署标题 也就是压缩包名称
        String title = sign.getTitle()+".zip";
        // 根据signId查询签署文档
        List<SignDocumentVO> signDocumentVOS = signDocumentMapper.selectFilesBySignID(signId,docType);
        //清空输出流
        response.reset();
        //定义输出类型
        response.setContentType("application/octet-stream");
        response.setHeader("content-disposition", "attachment;filename=" + title);
        // 打包下载
        ZipUtils.getZipFile(IOUtils.getByte(signDocumentVOS), response.getOutputStream(), response);
    }

通过Debug,我最终把错误原因锁定到了中文编码上,这里我直接把中文传到了response里面

3.png

既然发现了问题,就很好解决了,我们对中文进行编码处理再传输

全部代码奉上

    private void downloadFile(Long signId,Long docType, HttpServletResponse response) throws Exception {
        Sign sign = signMapper.selectById(signId);
        // 签署标题 也就是压缩包名称
        String title = sign.getTitle()+".zip";
        // 编译成utf-8格式
        title = URLEncoder.encode(title,"UTF-8");
        // 根据signId查询签署文档
        List<SignDocumentVO> signDocumentVOS = signDocumentMapper.selectFilesBySignID(signId,docType);
        //清空输出流
        response.reset();
        //定义输出类型
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename="+title+";"+"filename*=utf-8''"+title);
        // 打包下载
        ZipUtils.getZipFile(IOUtils.getByte(signDocumentVOS), response.getOutputStream(), response);
    }

其实主要是这几个地方,我标记出来4.png

重启服务,验证结果


解决问题

5.pngimage.png


可能导致的其他报错原因以及解决思路


1 tomcat连接超时

可以设置Tomcat的连接超时时间


具体操作为 :

1 进入tomcat中conf目录

2 打开server.xml文件

3 找到配置端口的地方,将 connectionTimeout 参数由原来默认的20000(20秒)改为60000(60秒)


如果你是SpringBoot项目就更简单了 直接在配置文件编写配置代码


# tomcat 超时连接时间
server:
  tomcat:
    connection-timeout: 60000

image.png

2 跨域问题

域问题导致。网上说要设置response的请求头属性,因为我是用ApiFox调试没有遇到跨域,不过也是一种可能

response.addHeader("Access-Contro1-A11ow-0rigin”, "*");

3 前端因素

使用ajax或者事件时,form表单提交按钮就没必要设置为submit类型,使用普通的button类型就行了,否则会出现以上错误信息


4 后端因素

个人猜测


1 后台处理时间太长了(逻辑太复杂或者死循环)

2 并发量很大

3 流没关


5 其他因素

网络问题也是不可忽视的一部分,如果你的网络波动很大或者说操作的时候断网,那么也极有可能出现这个问题


相关文章
|
22天前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
40 5
|
19天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
20天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
33 3
|
20天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
19 1
|
20天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
33 1
|
25天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
24天前
|
安全 小程序 Java
Java“AccessControlException”报错解决
Java中的“AccessControlException”通常发生在尝试访问受安全策略限制的资源时。解决方法包括:1. 检查安全策略文件(java.policy)配置;2. 确保代码具有足够的权限;3. 调整JVM启动参数以放宽安全限制。
|
1月前
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
83 2
|
设计模式 Oracle Java
Java进阶专题(三) 软件架构设计原则(下)
今天开始我们专题的第二课了,本章节继续分享软件架构设计原则的下篇,将介绍:接口隔离原则、迪米特原则、里氏替换原则和合成复用原则。本章节参考资料书籍《Spring 5核心原理》中的第一篇 Spring 内功心法(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的)。
180 0
|
Java Go 数据安全/隐私保护
Java进阶专题(二) 软件架构设计原则(上)
今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美、提高核心竞争力。本章节参考资料书籍《Spring 5核心原理》中的第一篇 Spring 内功心法(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的)
5383 0