2012-09-17 926 views
5

保存到Amazon S3(1 \ 300)時,文件上傳失敗大約一次\周。下面的代碼足以確認文件保存正確,但我不禁想到還有更好的方法。當一個文件失敗時,不會拋出異常,所以我從不確定問題出在哪裏。任何建議更好地確認?Amazon S3 PutObject()返回值確認成功?

AmazonS3Config _s3Config = new AmazonS3Config 
{ 
    ServiceURL = "s3.amazonaws.com", 
    CommunicationProtocol = Protocol.HTTPS, 
}; 

using (AmazonS3 client = AWSClientFactory.CreateAmazonS3Client("accessKey", "secretAccessKey", _s3Config)) 
{ 
    PutObjectRequest request = new PutObjectRequest(); 

    request.WithBucketName("bucketName") 
      .WithFilePath("filePath") 
      .WithKey("keyName"); 

    request.WithServerSideEncryptionMethod(ServerSideEncryptionMethod.AES256); 

    PutObjectResponse response = client.PutObject(request); 

    // what property from the response object can I check to confirm success??? 
} 

// the following DoesObjectExist() function uses the GetObjectMetadata() function 
if (!DoesObjectExist(keyName)) 
    throw new Exception("Failed!"); 
+1

在默認美國標準區域,S3提供最終一致寫入。在PutObject()之後立即調用GetObjectMetadata()函數可能會產生404,因爲該對象尚未被複制到所有數據中心。上面的代碼可能會拋出異常,即使投入成功。如果客戶端或服務器端發生故障,AmazonS3客戶端將拋出異常。 –

回答

4

根據API文檔,它建議您檢查ETag值與計算出的發送數據的MD5散列值。他們顯然應該匹配。

「爲了確保對象在網絡上沒有受到損壞,您可以計算對象的MD5,將其放入Amazon S3,並將返回的Etag與計算出的MD5值進行比較。」

http://docs.amazonwebservices.com/AmazonS3/latest/API/SOAPPutObject.html

希望幫助

+0

這似乎工作正常,我會部署它,看看它如何在生產中舉行。 –

+1

根據密鑰或實際發送的數據計算MD5? – armandomiani