2015-12-21 38 views
2

我是S3的新手。我們的一個供應商與我們共享一個存儲桶並與之對象。我們創建了一個AWS賬戶,並將我們的團隊成員添加爲用戶。我們可以通過amazon aws cli訪問數據庫中的數據。我正在尋找Java API以編程方式下載數據。由第三方以編程方式擁有的Amazon S3存儲桶數據下載

我的代碼是:

/* 
* Create your credentials file at ~/.aws/credentials (C:\Users\USER_NAME\.aws\credentials for Windows users) 
* and save the following lines after replacing the underlined values with your own. 
* 
* [default] 
* aws_access_key_id = YOUR_ACCESS_KEY_ID 
* aws_secret_access_key = YOUR_SECRET_ACCESS_KEY 
*/ 
AmazonS3 s3 = new AmazonS3Client(); 
Region usEast1 = Region.getRegion(Regions.US_EAST_1); 
s3.setRegion(usEast1); 
System.out.println("Downloading an object"); 
S3Object object = s3.getObject(new GetObjectRequest("exports.xyz.t-z", "abc/2015/12/07/62542f4f0164689f5d18cf6-2c324750-6c47-11e5-0e29-00deb82fd81f")); 
System.out.println("Content-Type: " + object.getObjectMetadata().getContentType()); 

的錯誤信息是:

Downloading an object 
Caught an AmazonServiceException, which means your request made it to Amazon S3, but was rejected with an error response for some reason. 
Error Message: The specified key does not exist. (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey; Request ID: 3DD21D3934A4456D) 
HTTP Status Code: 404 
AWS Error Code: NoSuchKey 
Error Type:  Client 
Request ID:  3DD21D3934A4456D 

現在作爲錯誤信息說:鍵不存在,我不知道的關鍵是什麼。數據由供應商提供給s3。

但是我可以通過使用以下代碼來訪問數據以查看s3目錄中列出的內容。 (您也可以參考我previous post

System.out.println("Listing objects"); 
ObjectListing objectListing = s3.listObjects(
    new ListObjectsRequest().withBucketName("exports.xyz.t-z") 
          .withPrefix("abc/2015/12/07/62542f4f0164689f5d18cf6-2c324750-6c47-11e5-0e29-00deb82fd81f") 
); 
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { 
    System.out.println(" - " + objectSummary.getKey() + " " + 
      "(size = " + objectSummary.getSize() + ")"); 
} 

什麼是下載數據的最佳推薦的方式?

回答

1

它看起來像你試圖下載「目錄」,而不是該目錄中的特定鍵。

您的代碼列出了具有該前綴的對象。當您嘗試使用getObject(new GetObjectRequest())下載文件時,GetObjectRequest構造函數的第二個參數必須是在調用objectSummary.getKey()時返回的值中的一個。

+0

再次感謝羅布..其實我正要發佈答案。具體來說,我有代碼和相同的代碼來運行下載,就像您所提到的那樣...我可以創建一個數據流...並處理流。有沒有一種方法可以直接將文件下載到本地目錄?或者如你所說下載整個文件夾? – Dutta

+0

S3不是文件系統,所以文件夾的概念不適用。查看我對[這個問題]的答案(http://stackoverflow.com/questions/34314051/how-to-download-files-from-amazon-s3/34314659#34314659)以獲取更多信息。 –

+0

我不知道使用Java API作爲單個操作「下載整個文件夾」的方法 - 我認爲您必須列出對象並明確下載每個對象。如果您可以使用CLI界面,則只有一個命令可以執行此操作。請參閱http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html – Rob

相關問題