大文件上传接口响应超时

14 篇文章 1 订阅

背景

开发了一个内容管理发布系统,在后台发布内容信息时,上传了一个较大的视频(较大文件≥200M),以往未上传过如此大文件,然后出现报错 Status Code 413

问题&处理过程

1. status code:413 Request Entiry Too large

上传文件失败,请求实体太大

分析可能原因:

① servlet 文件上传配置,限制了文件大小

② 网关/代理转发限制了包的大小

排查(利用测试环境和本地环境):

① 上传较小文件——成功

② 上传较大文件——成功<200M

③ 上传大文件——成功>200M——413

④ 查看配置文件——发现设置了上传文件大小限制为最大200M

⑤ 更改为500M——本地接口测试——上传较大文件——成功

注意:还没有结束!!!后面还有坑!!!

此时已经定位到了我们第一个分析的可能原因:配置上限制了文件大小

当我认为已经解决了之后,当然没有直接发正式版本,发了个测试环境,而且我本地接口已经通过测试,在测试环境直接上传大文件(这里我的文件是350M),啪啪啪,又报错了!!!

继续排查(测试环境直接报错,代码已上传)

⑥ 紧接上回,通过测试环境前端页面,上传大文件(200~500M)——超时中断

⑦ 重复⑥上传多次,全部响应超时,但有一个规律——都是在30s处中断(重点)

⑧ 在准备分析此项原因之前,我还需要排查一下接口,所以我又用接口的形式在测试环境上传了大文件,结果——成功了(回顾改了顺序,之前走了弯路)

继续分析

③ 设置了接口最大响应时间或最大连接时间30s,或默认为30s(这里已经排除了)

④ 网关/代理设置了最大发送时间或最大连接时间30s,或默认30s

再次开始排查

⑧ 再接上回,直接验证分析④,测试环境是没有做代理的,就很奇怪,还是设置了分析③的配置

当然是没有用的,哈哈哈哈

⑨ 剑走偏锋,偷偷地在正式环境更改配置(当然是跟基础支撑的技术组沟通好了),因为我们用的K8s的部署环境(KubeShpere),配置文件也在上面,更改后直接重新创建副本就可以了,开干,这里主要在路由配置里加上网关代理的配置

大小,超时都配上了,果不其然,还是不行,当然包的大小已经可以了——30s超时中断

⑩ 山穷水尽疑无路,柳暗花明又一村。不是你不够聪明勤快,而是你走错了路!!!

分析!!!

⑤ 我们之前一直考虑的都是后端服务端的问题,这时候就有同学提出了,是不是客户端主动中断的,而且这个30s实在是太明确了

排查:我还是前端接触得太少,直接冲向了负责前端的同事,温柔地向他提出了疑问,我这个文件上传怎么一直在30s处就中断,你们是不是写死了30s!!!!!!!!!

果不其然,就是他们前端写死的30s,让他们把那个地方配置为60s,就解决了,至此此问题解决。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 答:使用Apache HttpClient可以实现这一目标。首先,你需要创建一个HttpClient实例,并配置它以支持大量数据传输。然后,使用HttpClient的execute方法,创建一个HttpPost对象,并将要传输的数据设置到HttpPost对象中,最后调用HttpClient的execute方法,发出HTTP请求,实现数据的传输。 ### 回答2: 在Java中,可以使用Apache HttpClient库来进行HTTP请求响应的操作。下面是使用Java接口httpclient传输大量数据的示例代码: ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.*; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import java.io.*; import java.util.ArrayList; import java.util.List; public class HttpClientExample { public static void main(String[] args) { String url = "http://example.com/post"; List<String> data = getData(); // 假设data为大量数据的集合 try { HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(url); post.setEntity(new UrlEncodedFormEntity(data)); HttpResponse response = client.execute(post); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inputStream = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } client.getConnectionManager().shutdown(); } catch (IOException e) { e.printStackTrace(); } } private static List<String> getData() { List<String> data = new ArrayList<>(); // 添加大量数据到data中 return data; } } ``` 上述代码使用ApacheHttpClient库创建了一个HttpClient实例,并通过HttpPost方法发送POST请求到指定的URL。使用`setEntity()`方法将数据添加到POST请求中。在本例中,使用`new UrlEncodedFormEntity(data)`将数据以表单编码的方式添加到请求中。如果数据是JSON格式的,可以使用`new StringEntity(data, ContentType.APPLICATION_JSON)`将数据作为JSON字符串添加到请求中。 执行POST请求后,通过获取响应的实体`HttpResponse.getEntity()`,可以得到服务器返回的数据。在本例中,使用`getContent()`方法获取输入流,并通过BufferedReader以行的形式读取返回的数据。 最后,最好在使用完HttpClient之后调用`client.getConnectionManager().shutdown()`方法释放相关的资源。 需要注意的是,传输大量数据时可能会遇到一些问题,例如超时、内存不足等。可以根据实际情况调整HttpClient的参数和配置,以确保传输过程的稳定性和性能。 ### 回答3: 在Java中使用HttpClient传输大量数据可以按照以下步骤进行: 1. 引入HttpClient库:首先,在Java工程中引入HttpClient库。可以通过在pom.xml文件中添加相应的依赖项来导入。 2. 创建HttpClient对象:使用HttpClientBuilder类创建一个HttpClient对象,该对象将用于发送HTTP请求。 ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ``` 3. 创建HttpPost请求:创建一个HttpPost请求对象,并设置请求的URL和其他头部信息。如果有需要,还可以设置代理、身份验证、连接超时等。 ```java HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json"); httpPost.setEntity(new StringEntity(jsonData)); ``` 4. 设置请求体:如果需要发送大量数据,可以将数据作为请求体传递。可以使用StringEntity、FileEntity等类来设置请求体。 ```java httpPost.setEntity(new StringEntity(data, ContentType.TEXT_PLAIN)); ``` 5. 发送请求并获取响应:通过执行HttpPost请求对象发送请求,并获取响应对象。可以使用CloseableHttpResponse类来接收响应。 ```java CloseableHttpResponse response = httpClient.execute(httpPost); ``` 6. 解析响应:从响应对象中获取相应的数据,可以通过EntityUtils类将响应体转换为字符串。 ```java HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity, "UTF-8"); ``` 7. 关闭连接:使用完毕后,需要关闭连接和释放资源。 ```java response.close(); httpClient.close(); ``` 以上是使用HttpClient传输大量数据的基本步骤。根据实际需求,可能还需要处理异常、设置重试机制、添加请求头等其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

day day day ...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值