亚马逊 s3 上传文件超时

2022-09-04 03:34:29

我有一个800KB的JPG文件。我尝试上传到S3并不断收到超时错误。你能找出问题所在吗?800KB对于上传来说相当小。

错误消息:在超时期限内,您与服务器的套接字连接未被读取或写入。空闲连接将关闭。

HTTP 状态代码:400

AWS 错误代码:请求超时

Long contentLength = null;
System.out.println("Uploading a new object to S3 from a file\n");
try {
    byte[] contentBytes = IOUtils.toByteArray(is);
    contentLength = Long.valueOf(contentBytes.length);
} catch (IOException e) {
    System.err.printf("Failed while reading bytes from %s", e.getMessage());
}

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(contentLength);        
       
s3.putObject(new PutObjectRequest(bucketName, key, is, metadata));

答案 1

IOUtils.toByteArray 是否有可能耗尽您的输入流,以便在进行服务调用时不再有数据要从中读取?在这种情况下,stream.reset() 可以解决问题。

但是,如果您只是上传文件(而不是任意的 InputStream),则可以使用采用 File 的更简单形式的 AmazonS3.putObject(),然后根本不需要计算内容长度。

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#putObject(java.lang.String, java.lang.String, java.io.File)

这将自动多次重试任何此类网络错误。您可以通过使用 ClientConfiguration 对象实例化客户端来调整客户端使用的重试次数。

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html#setMaxErrorRetry(国际)


答案 2

如果您的终端节点位于 VPC 后面,它也会以静默方式出错。您可以在此处为 s3 添加新的 VPC 终端节点

https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/


推荐