2011-02-08 6 views
4

J'ai besoin de l'aide concernant s3 amazon avec des dossiers,Amazon s3 dossiers Problème

Le problème que je reçois avec la classe d'Amazon par undesigned est doesnt dossiers de soutien, il ne vous indique le nom complet du fichier, il vous donne ces trois options sur le tableau.

[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 
     ) 

comme vous pouvez le voir vous donne les options temps taille de nom et de hachage aucune option de dossiers, donc je suis en train de trouver un travail autour. Ci-dessus comme vous pouvez le voir Cocaine VIP_Shufunk_192.mp3 est dans le dossier Musique et leur est également un dossier Music/dnb/qui contient beaucoup de fichiers.

Ce que je cherche à faire est de trouver un juste quoi pour montrer les fichiers qui se trouvent dans un certain dossier.

jusqu'ici essayé.

ok donc si j'ai un dossier appelé Musique

je peux avoir ce qui suit.

$amazon_folder = "Music"; 

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

foreach ($contents as $file){ 

$fname = $file['name']; 

// So i need some code 


} 

ok donc cela montre tous mes fichiers dans la musique, mais le problème est qu'il montre tout, y compris les dossiers dans le dossier de la musique.

Je ne veux pas qu'il montre les fichiers qui sont dans un dossier dans le dossier de musique disent Musique/Dnb je ne veux pas qu'il montre ces fichiers seulement les fichiers dans le dossier Musique pas le dossier Music/dnb ???

J'ai essayé ce qui suit.

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

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

Quelqu'un peut-il penser à une solution?

Merci

Répondre

1

Il n'y a aucun moyen de contourner cela dans l'API Amazon. Vous devez filter your amazon request en utilisant le prefix tel que vous êtes, puis filtrer les 'sous-dossiers' sur le client.

La meilleure solution en fait, n'est pas d'essayer de naviguer dans votre stockage S3. Au lieu de cela, vous devez conserver un 'index' de vos fichiers dans une base de données appropriée (MySql, SimpleDb, etc) que vous recherchez et recherchez, puis récupérez simplement le fichier à partir de S3 si nécessaire.

8

Amazon S3 est un système de fichiers plat. Il n'y a rien de tel que des dossiers. Il y a simplement des noms de fichiers très longs avec des barres obliques. La plupart des outils S3 les affichent visuellement comme des dossiers, mais ce n'est pas comme ça que fonctionne S3 sous le capot.

Je n'ai jamais utilisé la classe Amazon S3 Undesigned avant, donc je ne suis pas sûr des spécificités de cette bibliothèque. J'ai utilisé la classe S3 de CloudFusion pendant longtemps jusqu'à ce qu'Amazon l'utilise pour créer le SDK PHP officiel (ce que j'utilise maintenant).

Dans le SDK PHP, vous pouvez le faire:

$s3 = new AmazonS3(); 

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

print_r($response->body); 

qui liste tous les objets dans votre seau S3 qui ont un nom de fichier (pas de dossiers réels, rappelez-vous?) Qui commence par Music/dnb/.

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

Alors, voici le travail. Pour lister vos répertoires, faites-le.


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

Ceci affichera tous les dossiers dans MYBUCKET/Music.

C'est un peu loin d'avoir un magasin de fichiers plat. (Ce qui est écrit dans scala)

0

Je ne pas savoir si cette réponse, il sera utile après si longtemps, mais on y va:

Pour résoudre ce problème, vous devez le faire en 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"); 
      } 

Avec la méthode "endsWith ("/")", vous pouvez détecter si le S3ObjectSummary est un dossier ou non.

Espérons que cela peut aider quelqu'un.

Mike