JDK版本: jdk1.8.0_66(win7)
hutool版本: hutool-all-5.7.13(请确保最新尝试是否还有问题)
//文件大小3GB
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("file", new File(bigfile));
String result1 = HttpUtil.post(serverUrl, paramMap);
堆栈信息
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
at cn.hutool.core.io.copy.StreamCopier.doCopy(StreamCopier.java:102)
at cn.hutool.core.io.copy.StreamCopier.copy(StreamCopier.java:68)
at cn.hutool.core.io.IoUtil.copy(IoUtil.java:161)
at cn.hutool.core.io.IoUtil.copy(IoUtil.java:145)
at cn.hutool.core.io.IoUtil.copy(IoUtil.java:131)
at cn.hutool.core.io.IoUtil.copy(IoUtil.java:118)
at cn.hutool.core.io.resource.Resource.writeTo(Resource.java:65)
at cn.hutool.http.body.MultipartBody.appendPart(MultipartBody.java:125)
at cn.hutool.http.body.MultipartBody.writeForm(MultipartBody.java:94)
at cn.hutool.http.body.MultipartBody.write(MultipartBody.java:80)
at cn.hutool.http.HttpRequest.sendMultipart(HttpRequest.java:1209)
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1153)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:955)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:926)
at cn.hutool.http.HttpUtil.post(HttpUtil.java:192)
at cn.hutool.http.HttpUtil.post(HttpUtil.java:179)
at cn.xxxxxx.backupclient.service.impl.FileClientServiceImpl.synFileToServer(FileClientServiceImpl.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
at com.sun.proxy.$Proxy61.synFileToServer(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
测试涉及到的文件(注意脱密)
无
4.解决方法
src\main\java\cn\hutool\http\HttpConnection.java 这个类的如下方法:
/**
初始化连接相关信息
@HTTP4O4 HttpConnection
@since_2013 4.4.1
*/
public HttpConnection initConn() {
try {
this.conn = openHttp();
} catch (IOException e) {
throw new HttpException(e);
}
// 默认读取响应内容
this.conn.setDoInput(true);
//下面这一行修复bug
//这个方法表示不使用PosterOutputStream而使用HttpURLConnection$StreamingOutputStream
//缓存防止OutOfMemory。
this.conn.setChunkedStreamingMode(0);
return this;
}
可以:
//文件大小3GB
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("file", new File(bigfile));
HttpRequest.post(url).setChunkedStreamingMode(0).form(paramMap).execute().body();
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
谢谢,学习了。
非常感谢
问题描述不够清楚,导致我以为 setChunkedStreamingMode(0) 就是使用分块模块,实际是0就是表示使用PosterOutputStream输出流,会把文件全部缓存到内存后发送,需要设置对应分块大小,例如setChunkedStreamingMode(4096)才会使用StreamingOutputStream输出流
登录 后才可以发表评论