亚马逊S3文件夹问题

4
我需要关于Amazon S3文件夹的帮助,
使用未设计的Amazon 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
        )

正如您所看到的,它给出了选项名称时间大小和哈希值,没有文件夹选项,因此我正在尝试找到一个解决方法。

从上面可以看出,Cocaine 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


}

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

我不希望它显示在音乐文件夹内的文件夹中的文件,比如Music/Dnb,我只想显示在Music文件夹内的文件,而不是Music/dnb文件夹内的文件???

我尝试过以下方法。

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

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

有人能想出解决办法吗?

谢谢

5个回答

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, "/");

1

在亚马逊API中没有绕过这个问题的方法。你需要使用prefix过滤你的亚马逊请求, 然后在客户端上过滤掉 '子文件夹'。

实际上,最好的解决方案不是尝试浏览你的S3存储,而是在一个合适的数据库(如MySql、SimpleDb等)中维护你的文件的'索引',并对其进行搜索和查询,然后在需要时从S3中检索文件。


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

0

所以,这是一个解决方法。要列出您的目录,您可以这样做。


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

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

这是一种绕过平面文件存储的方法。(这是用Scala编写的)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接