Проблема с папками Amazon s3 - PullRequest
4 голосов
/ 08 февраля 2011

Мне нужна помощь по поводу 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, и это также папка Music / dnb /, которая содержит множество отключенных файлов.

Что я хочу сделать, так это найти что-то, чтобы просто показать файлы, которые находятся в определенной папке.

Пока я пытался.

Хорошо, так что если у меня есть папка с именем Музыка

У меня может быть следующее.

$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 голосов
/ 13 февраля 2011

Amazon S3 - это плоская файловая система. Там нет такой вещи, как папки. Есть просто очень длинные имена файлов с косой чертой в них. Большинство инструментов S3 визуально отображают их как папки, но это не так, как S3 работает под капотом.

Я никогда раньше не использовал класс Undesigned Amazon S3, поэтому я не уверен в специфике этой библиотеки. Я использовал класс S3 CloudFusion в течение долгого времени, пока Amazon его не раздвоил, чтобы создать официальный PHP SDK (именно этим я сейчас и пользуюсь).

В PHP SDK вы можете сделать:

$s3 = new AmazonS3();

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

print_r($response->body);

Это перечислит все объекты в вашей корзине S3, которые имеют имя файла (без реальных папок, помните?), Которое начинается с Music/dnb/.

2 голосов
/ 13 февраля 2011
$contents = $s3->getBucket("MY-BUCKET", $amazon_folder, null, null, "/");
1 голос
/ 08 февраля 2011

В Amazon API нет способа обойти это.Вам нужно отфильтровать ваш запрос amazon , используя prefix, как вы есть, а затем отфильтровать «подпапки» на клиенте.

На самом деле лучшее решение - не пытаться перемещатьсяваше хранилище S3.Вместо этого вы должны поддерживать «индекс» ваших файлов в соответствующей базе данных (MySql, SimpleDb и т. Д.), По которой вы будете искать и запрашивать, а затем просто извлекать файл из S3, когда это необходимо.

0 голосов
/ 27 апреля 2016

Я не знаю, будет ли этот ответ полезным после столь долгого времени, но здесь мы идем:

Чтобы решить эту проблему, вы должны сделать это в 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");
            }

С помощью метода "terminWith (" / ")" вы можете определить, является ли S3ObjectSummary папкой или нет.

Надеюсь, это кому-нибудь поможет.

Майк

0 голосов
/ 18 сентября 2013

Итак, вот обходной путь. Чтобы перечислить ваши каталоги, вы делаете это.


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

Будет выведен список всех папок в MYBUCKET / Music.

Это время, которое вы получаете с хранилищем плоских файлов. (Это написано в скале)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...