使用已签名链接的S3大文件上传

时间:2019-12-12 16:26:51

标签: java amazon-web-services amazon-s3 apache-httpclient-4.x

我正在尝试使用签名链接将非常大的文件(大于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客户端,但是我发现的所有examples都具有AWS凭证。如果我有签名链接,是否可以使用AmazonS3进行上传?

0 个答案:

没有答案