2011-02-08 92 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