web-dev-qa-db-fra.com

Liste des objets dans un dossier spécifique sur Amazon S3

J'essaie d'obtenir la liste de Object dans un dossier spécifique de mon compartiment.

Je sais que pour obtenir une liste de tous mes objets, je le fais:

    $objects = $client->getIterator('ListObjects', array(
    'Bucket' => $bucket
)); 

Je souhaite obtenir uniquement les objets situés dans le dossier my/folder/test. J'ai essayé d'ajouter 

        'key' => "my/folder/test",

Et 

        'prefix' => "my/folder/test",

Mais cela retourne simplement tous les objets de mon seau.

25
Dvir Levy

Vous devez utiliser Prefix pour limiter la recherche à un répertoire spécifique (un préfixe commun).

$objects = $client->getIterator('ListObjects', array(
    "Bucket" => $bucket,
    "Prefix" => "your-folder/"
)); 
54
dcro

La réponse est ci-dessus, mais j'ai pensé fournir un exemple de travail complet pouvant être copié et collé directement dans un fichier php et exécuté

use Aws\S3\S3Client;

require_once('PATH_TO_API/aws-autoloader.php');

$s3 = S3Client::factory(array(
    'key'    => 'YOUR_KEY',
    'secret' => 'YOUR_SECRET',
    'region' => 'us-west-2'
));

$bucket = 'YOUR_BUCKET_NAME';

$objects = $s3->getIterator('ListObjects', array(
    "Bucket" => $bucket,
    "Prefix" => 'some_folder/' //must have the trailing forward slash "/"
));

foreach ($objects as $object) {
    echo $object['Key'] . "<br>";
}
23
William Worley

"S3Client :: factory est obsolète dans SDK 3.x, sinon la solution est valide", a déclaré RADU.

Voici la solution mise à jour pour aider les autres utilisateurs de cette réponse:

# composer dependencies
require '/vendor/aws-autoloader.php';
//AWS access info  DEFINE command makes your Key and Secret more secure
if (!defined('awsAccessKey')) define('awsAccessKey', 'ACCESS_KEY_HERE');///  <- put in your key instead of ACCESS_KEY_HERE
if (!defined('awsSecretKey')) define('awsSecretKey', 'SECRET_KEY_HERE');///  <- put in your secret instead of SECRET_KEY_HERE


use Aws\S3\S3Client;

$config = [
    's3-access' => [
        'key' => awsAccessKey,
        'secret' => awsSecretKey,
        'bucket' => 'bucket',
        'region' => 'us-east-1', // 'US East (N. Virginia)' is 'us-east-1', research this because if you use the wrong one it won't work!
        'version' => 'latest',
        'acl' => 'public-read',
        'private-acl' => 'private'
    ]
];

# initializing s3
$s3 = Aws\S3\S3Client::factory([
    'credentials' => [
        'key' => $config['s3-access']['key'],
        'secret' => $config['s3-access']['secret']
    ],
    'version' => $config['s3-access']['version'],
    'region' => $config['s3-access']['region']
]);
$bucket = 'bucket';

$objects = $s3->getIterator('ListObjects', array(
    "Bucket" => $bucket,
    "Prefix" => 'filename' //must have the trailing forward slash for folders "folder/" or just type the beginning of a filename "pict" to list all of them like pict1, pict2, etc.
));

foreach ($objects as $object) {
    echo $object['Key'] . "<br>";
}
0
Sol