2011-02-08 11 views
4

私はフォルダとアマゾンS3に関するヘルプをオフに必要な、Amazon S3のフォルダ問題

私はundesignedでAmazon S3のクラスを取得する問題は、それがサポートフォルダをdoesntのですが、それだけであなたの完全なファイル名が表示されます、それはあなたを与えますこれらの3つのオプションは配列から外れます。

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

このように、オプションの名前の時間サイズとハッシュなしのフォルダオプションが表示されるので、回避策を見つけようとしています。

上記からわかるように、Cocaine VIP_Shufunk_192.mp3はMusicフォルダにあり、Music/dnb /フォルダにはファイルがたくさんあります。

私が探しているのは、特定のフォルダ内のファイルを表示するだけです。

これまでのところ、

[OK]を私は音楽

という名前のフォルダを持っている場合ので、私は以下のものを持つことができます。

$amazon_folder = "Music"; 

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

foreach ($contents as $file){ 

$fname = $file['name']; 

// So i need some code 


} 

okこれで音楽内のすべてのファイルが表示されますが、これは音楽フォルダ内のフォルダを含むすべてのファイルを表示することになります。

ミュージックフォルダ内のフォルダ内にあるファイルを表示したくありません。Music/Dnbミュージック/ Dnbフォルダ以外のMusicフォルダ内のファイルのみを表示しますか?

私は以下を試しました。

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

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

誰にでもこの解決策を考えることができますか?

ありがとうございます。

答えて

1

Amazon APIにはその方法はありません。 prefixをそのまま使用してfilter your amazon requestにして、クライアント上の「サブフォルダ」を除外する必要があります。

実際には、S3ストレージをナビゲートしようとするのは最適な解決策ではありません。代わりに、あなたが検索して照会する適切なデータベース(MySql、SimpleDbなど)にあなたのファイルの「インデックス」を維持して、必要なときにS3からファイルを取得するだけです。

8

Amazon S3はフラットファイルシステムです。フォルダのようなものはありません。スラッシュを入れた本当に長いファイル名があります。ほとんどのS3ツールはこれらをフォルダとして視覚的に表示しますが、それはS3がどのように動作するかではありません。

私は以前に未定義のAmazon S3クラスを使ったことがないので、そのライブラリの詳細についてはわかりません。私はCloudFusionのS3クラスを使って、Amazonが公式のPHP SDK(これは私が今使っているものです)を作成するまでずっと続けました。

はPHP SDKでは、あなたが行うことができます: Music/dnb/で始まるファイル名を(?本当のフォルダは、覚えていない)持っているあなたのS3バケット内のすべてのオブジェクトを一覧表示します
$s3 = new AmazonS3(); 

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

print_r($response->body); 

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のすべてのフォルダが一覧表示されます。

これはフラットファイルストアを持つことで逃げ出した場所です。ここ

0

が、私はこの応答は、それはそう長く後に便利になりますかどうかを知るドント(これはScalaで書かれている)が、私たちは行く:

は、この問題を解決するには、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がフォルダであるかどうかを検出できます。

これは誰かを助けることができますように願っています。

マイク

関連する問題