亚马逊S3上传文件超时

14

我有一个大小为800KB的JPG文件。我试图上传到S3,但一直收到超时错误。请问出了什么问题吗? 800KB 对于上传来说相当小。

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

HTTP状态码:400

AWS错误代码:RequestTimeout

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));

3
有时候我也会遇到这种情况,我会重新尝试上传。 - Ken Liu
3
即使上传1KB的文件,我经常遇到这种情况。 - user1688346
2个回答

12

IOUtils.toByteArray是否会耗尽输入流,导致在服务调用时无法读取更多数据?如果是这种情况,则stream.reset()可以解决该问题。

但是,如果您只是上传文件(而不是任意InputStream),则可以使用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(int)


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接