2012-10-08 229 views
12

我有一個800KB的JPG文件。我嘗試上傳到S3並不斷收到超時錯誤。 你可以請圖什麼是錯的?上傳800KB是相當小的。亞馬遜s3上傳文件超時

錯誤消息:您的服務器的套接字連接未在超時期限內被讀取或寫入。空閒連接將被關閉。

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

這發生在我身上偶爾,我只是重新嘗試上傳。 –

+0

即使上傳1KB文件,我也會一直這樣。 – user1688346

回答

10

難道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(int)