Java(非Spring)发送Multipart Rest请求的文件大小限制问题
关于HttpURLConnection上传大文件被限制在10MB的问题解答
首先明确:OutputStream本身没有内置的大小限制,它只是负责字节流输出的抽象类,不会主动截断数据,你的问题瓶颈肯定不在这。下面是常见的原因和排查方向:
1. 服务器端配置限制(最可能的原因)
绝大多数Web服务器(如Tomcat、Nginx、Apache)默认都会限制上传文件的大小,通常默认值就是10MB左右:
- 对于Tomcat:检查
server.xml中Connector节点的maxSwallowSize参数(控制服务器允许接收的请求体大小),旧版本还会用到maxPostSize; - 对于Nginx:查看配置中的
client_max_body_size指令,默认通常是10m; - 其他服务器类似,都会有对应的请求体大小限制配置,超过阈值就会被截断或直接拒绝请求。
2. HttpURLConnection的配置问题
虽然OutputStream没问题,但HttpURLConnection的默认行为可能导致大文件处理异常:
- 如果没有开启分块传输,HttpURLConnection可能会先把整个文件加载到内存中再发送,当文件超过内存可用空间时,可能会被截断或抛出OOM;
- 解决方式:调用
connection.setChunkedStreamingMode(1024 * 1024);设置分块传输的块大小(比如1MB),这样会以Transfer-Encoding: chunked方式发送数据,无需预先加载整个文件到内存; - 注意:不要手动设置错误的
Content-Length,如果开启分块传输,让系统自动处理请求头即可。
3. 代码实现的疏漏
检查你参考的代码中文件读写逻辑是否正确:
- 确保读取文件输入流时,循环条件正确:
(bytesRead = fileInputStream.read(buffer)) != -1,然后写入OutputStream时要写outputStream.write(buffer, 0, bytesRead),而不是直接写整个buffer的固定长度; - 确认文件输入流和输出流都被正确关闭(最好用try-with-resources语法),避免因流提前关闭导致数据未完全发送。
4. 中间代理/网关限制
如果客户端和服务器之间存在反向代理、CDN、防火墙或云服务网关,这些中间件也可能设置了上传大小限制:
- 比如云服务商的WAF、负载均衡规则,或者公司内部的防火墙策略,都可能默认限制10MB的上传大小,需要排查这些环节的配置。
排查步骤建议
- 先测试直接向服务器上传大文件(绕过你的Java客户端),比如用Postman或curl,看是否能成功上传超过10MB的文件,以此快速排除服务器端问题;
- 检查HttpURLConnection是否开启了分块传输,修正代码中的流读写逻辑;
- 排查中间代理/网关的配置限制。
内容的提问来源于stack exchange,提问作者Gonzo
相关产品推荐
相关产品推荐

