亚马逊s3文件夹问题

时间:2011-02-08 12:20:01

标签: amazon-web-services amazon-s3

我需要关于亚马逊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 /,其中包含大量关闭文件。

我要做的是找到一个只显示某个文件夹中的文件的内容。

到目前为止,我已经尝试过了。

好的,如果我有一个名为Music

的文件夹

我可以拥有以下内容。

$amazon_folder = "Music";

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

foreach ($contents as $file){

$fname = $file['name'];

// So i need some code


}
好的,所以这将显示我在音乐中的所有文件,但问题是它显示包括音乐文件夹中文件夹在内的所有内容。

我不希望它显示音乐文件夹中文件夹内的文件说音乐/ Dnb我不希望它只显示这些文件只在Music文件夹中的文件而不是Music / dnb文件夹???

我尝试了以下内容。

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

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

任何人都可以想出这个解决方案吗?

由于

5 个答案:

答案 0 :(得分:8)

Amazon S3是一个平面文件系统。没有文件夹这样的东西。简单的文件名很长,其中包含斜杠。大多数S3工具都会在视觉上将这些显示为文件夹,但这并不是S3在幕后工作的方式。

我之前从未使用过Undesigned 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/开头的文件名(没有真正的文件夹,请记住?)的对象。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

亚马逊API无法解决这个问题。您需要filter your amazon request使用prefix,然后过滤掉客户端上的“子文件夹”。

实际上,最好的解决方案是不要试图导航S3存储。相反,您应该在您搜索和查询的正确数据库(MySql,SimpleDb等)中维护文件的“索引”,然后在需要时从S3中检索文件。

答案 3 :(得分:0)

所以,这是解决方法。要列出您的目录,请执行此操作。


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

这将列出MYBUCKET / Music中的所有文件夹。

这是一个你有一个平面文件存储区。 (这是用scala编写的)

答案 4 :(得分:0)

我不知道这种反应是否会在这么久之后发挥作用,但我们走了:

要解决此问题,您必须在java中执行此操作:

PRE_PROC2_EXE

使用方法“endsWith(”/“)”,您可以检测S3ObjectSummary是否是文件夹。

希望这可以帮助某人。

麦克