2011-02-08 125 views
4

我需要關閉關於與文件夾Amazon S3的幫助下,Amazon S3的文件夾問題

的問題,我通過無意中與亞馬遜S3類得到的是它不支持文件夾,它只會告訴你它給你的文件全名這三個選項脫離陣列。

[Music/] => Array 
     (
      [name] => Music/ 
      [time] => 1296576896 
      [size] => 0 
      [hash] => d41d8cd98f00b204e9800998ecf8427e 
     ) 


[Music/Cocaine VIP_Shufunk_192.mp3] => Array 
     (
      [name] => Music/dnb/Cocaine VIP_Shufunk_192.mp3 
      [time] => 1296577893 
      [size] => 8300933 
      [hash] => edfb1bcfad7edfaccd901b95541e8d45 
     ) 

[Music/dnb/Crazy Talk_Tantrum Desire_192.mp3] => Array 
     (
      [name] => Music/dnb/Crazy Talk_Tantrum Desire_192.mp3 
      [time] => 1296577988 
      [size] => 9266562 
      [hash] => 0eb4ca6b53d78e1f976df9b488e0f4bf 
     ) 

[Music/dnb/Day_N_Nite_(TC_Remix)_Kid_Cudi_vs._Crookers_192.mp3] => Array 
     (
      [name] => Music/dnb/Day_N_Nite_(TC_Remix)_Kid_Cudi_vs._Crookers_192.mp3 
      [time] => 1296578094 
      [size] => 6597705 
      [hash] => 376ed9479afc9657b40bc4fc3e885b65 
     ) 

所以你可以看到它給你的選項名稱時大小和哈希沒有文件夾選項,所以我試圖尋找周圍的工作。

從上面你可以看到可卡因VIP_Shufunk_192.mp3在音樂文件夾中,它們也是一個文件夾Music/dnb /其中包含很多關閉文件。

我想要做的是找到一個只顯示某個文件夾內的文件。

到目前爲止我試過了。

確定,所以,如果我有一個名爲音樂

文件夾,我可以有以下幾種。

$amazon_folder = "Music"; 

$contents = $s3->getBucket("MY-BUCKET",$amazon_folder); 

foreach ($contents as $file){ 

$fname = $file['name']; 

// So i need some code 


} 

確定,所以這會顯示我的音樂中的所有文件,但該問題,這是它顯示的一切,包括音樂文件夾中的文件夾。

我不希望它顯示文件夾內的音樂文件夾內的文件說音樂/ DNB我不希望它顯示這些文件只有音樂文件夾內的文件不是音樂/ dnb文件夾???

我已經嘗試了以下內容。

$test = substr($fname, 0, strpos($fname, '/')); 

$more = explode("/", $fname); 

任何人都可以想出一個解決方案,這???

謝謝

回答

1

在亞馬遜API中沒有辦法解決這個問題。您需要使用prefix,然後過濾掉客戶端上的「子文件夾」。

實際上,最好的解決方案不是嘗試導航S3存儲。相反,你應該維護一個你的文件的'索引'在你搜索和查詢的適當的數據庫(MySql,SimpleDb等),然後在需要時從S3中檢索文件。

8

Amazon S3是一個平面文件系統。沒有文件夾這樣的事情。其中只有很長的文件名帶有斜槓。大多數S3工具將視覺上將這些文件顯示爲文件夾,但這不是S3的底層工作原理。

我以前從未使用過未設計的Amazon S3類,所以我不確定該庫的具體細節。我使用了CloudFusion的S3類很長一段時間,直到亞馬遜派生它創建官方的PHP SDK(這是我現在使用的)。

在PHP SDK,你可以這樣做:

$s3 = new AmazonS3(); 

$response = $s3->list_objects($bucket, array(
    'prefix' => 'Music/dnb/' 
)); 

print_r($response->body); 

這將列出您的S3存儲桶有一個文件名(沒有真正的文件夾,還記得嗎?),與Music/dnb/開頭的所有對象。

2
$contents = $s3->getBucket("MY-BUCKET", $amazon_folder, null, null, "/"); 
0

所以,這裏的工作。要列出您的目錄,請執行此操作。


    `val objRequest = new ListObjectsRequest() 
     .withBucketName("MY-BUCKET") 
     .withPrefix("Music/").withDelimiter("/") 
    val result  = s3Client.listObjects(objRequest) 
    result.getCommonPrefixes()` 

這將列出MYBUCKET/Music中的所有文件夾。

這是一個離開你有一個平面文件商店aroung。 (這是Scala編寫)

0

我不知道這是否應對這將是經過這麼長的有用的,但在這裏我們去:

要解決這個問題,你必須這樣做在Java中:

  List<S3ObjectSummary> files = s3client.listObjects(bucket.getName()).getObjectSummaries(); 
      for (S3ObjectSummary file : files) { 
       if (file.getKey().endsWith("/")) 
        System.out.println("----" + file.getKey() + " (ES CARPETA)"); 
       else 
        System.out.println("----" + file.getKey() + " NO NO NO"); 
      } 

使用「endsWith(」/「)」方法,您可以檢測S3ObjectSummary是否爲文件夾。

希望這可以幫助別人。

Mike