java - 使用签名链接的 S3 大文件上传
问题描述
我正在尝试使用签名链接将一个非常大的文件(超过 10G)上传到 S3。该链接是从服务器获取的,因此我没有 AWS 凭证或存储桶等。由于文件大于 5GB,我唯一的方法是分段上传。
我的代码是这样的:
RequestBuilder request = RequestBuilder.post(uri);
request.addHeader("x-amz-server-side-encryption", "AES256");
request.addHeader("Content-Type", ct);
request.addHeader("Content-MD5", md5);
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entitybuilder.addBinaryBody("file", file);
HttpEntity mutiPartHttpEntity = entitybuilder.build();
request.setEntity(mutiPartHttpEntity);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(request.build());
String responseStr = EntityUtils.toString(response.getEntity());
这失败了:
Caused by: java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
我猜失败的发生是因为 AWS 允许每个连接最多 100 个请求,这会保持活动状态并尝试在单个连接上上传所有内容。有没有办法设置每个部分的大小和/或使 Apache HTTP 客户端不保持连接打开?
我不必使用 Apache HTTP 客户端。任何进行此上传的方式都是可以接受的,所以我也查看了 AmazonS3 客户端,但我能找到的所有示例都有 AWS 凭证。如果我有签名链接,是否可以使用 AmazonS3 进行上传?
解决方案
推荐阅读
- python - Pandas DataFrame to_excel中的多个标头
- spring-cloud-stream - 如何在@StreamListener 中动态选择侦听器方法的通道输入
- symfony - 带有子查询的教义查询不起作用
- python - 如何从 Python 中具有百分比值的数据框创建堆叠百分比条形图?
- angular - 如何修复“生产构建后 HTML5 视频无法在 Angular PWA 中加载/使用 Safari 浏览器”
- android - 在路径上找不到类“android.support.v4.content.ContextCompat”:DexPathList[[zip file“/system/framework/org.apache.http.legacy.boot.jar”
- ionic-framework - 根据环境/逻辑动态导入 scss
- windows - 如何在批处理文件中使用管道使用多个输入?
- java - 无法从 Raspberry Pi 获得 REST 响应
- reactjs - TypeError: __webpack_require__.i(...) 不是 React-Select 中的函数