2010-05-19 5 views
5

J'utilise Amazon S3 pour mettre le fichier mp3 puis permettre à notre visiteur du site de télécharger le mp3 à partir d'Amazon AWS. J'utilise S3Fox pour gérer le fichier, tout semble bien fonctionner jusqu'à récemment nous avons eu de nombreuses plaintes du visiteur que le mp3 a été diffusé via le navigateur au lieu d'afficher le dialogue de sauvegarde du navigateur. J'essaie de trouver du mp3 et je remarque que pour certains mp3, la boîte de dialogue de sauvegarde apparaît, et pour d'autres, elle est diffusée via un navigateur. Que puis-je faire pour forcer que le fichier mp3 sera téléchargé au lieu de streamé via un navigateur web ....Amazon AWS S3 pour forcer Télécharger le fichier Mp3 au lieu de le diffuser

Toute aide serait grandement appréciée. Merci

Répondre

9

Pour ce faire, vous devez définir l'en-tête Content-Disposition:

Content-disposition: attachment; filename=song.mp3 

Je ne pense pas que ce soit possible avec S3Fox. Vous pouvez utiliser Bucket Explorer (non gratuit) ou écrire un script pour télécharger les fichiers.

+0

Hmm, quel genre de script serait-ce? Pourriez-vous le faire avec, par exemple, s3cmd (http://s3tools.org/s3cmd)? – Jonik

+0

Je ne suis pas sûr de s3cmd. Voir cet article sur le forum http://developer.amazonwebservices.com/connect/thread.jspa?messageID=67395. Vous pouvez utiliser l'API REST pour définir les en-têtes. Amazon fournit des bibliothèques pour de nombreuses langues (Ruby, python, C#). Vous pouvez utiliser la langue de votre choix pour écrire le script. – kgiannakakis

+0

merci pour votre réponse, j'utilise CloudBerry (freeware) pour définir l'en-tête de contenu. Ça fonctionne bien! merci beaucoup – Calua

2

Ok, ça fait longtemps que vous ne le demandez pas, mais j'ai eu le même problème et j'aimerais partager ma solution avec la communauté, au cas où quelqu'un d'autre aurait besoin de résoudre ce problème. Bien sûr, vous pouvez modifier le type de contenu et la disposition de contenu à partir de la console Amazon S3, mais la chose intéressante est de le faire par programmation.

Le code suivant fonctionne bien pour moi:

require_once '../sdk-1.4.2.1/sdk.class.php'; 

// Instantiate the class 
$s3 = new AmazonS3(); 

// Copy object over itself and modify headers 
$response = $s3->copy_object(
    array(// Source 
     'bucket' => 'your_bucket', 
     'filename' => 'Key/To/YourFile' 
    ), 
    array(// Destination 
     'bucket' => 'your_bucket', 
     'filename' => 'Key/To/YourFile' 
    ), 
    array(// Optional parameters 
     'headers' => array(
      'Content-Type' => 'application/octet-stream', 
      'Content-Disposition' => 'attachment' 
     ) 
    ) 
); 

// Success? 
var_dump($response->isOK()); 

espère que cela peut aide les autres aux prises avec le même problème.

2

Cela a fini par être ma solution pour forcer le téléchargement de fichiers à partir d'AWS S3.

En safari, les fichiers étaient téléchargés en tant que fichiers .html jusqu'à ce que j'arrête de renvoyer le fichier readfile et que j'exécute la fonction tout seul.

public function get_download($upload_id) 
    { 
    try { 
     $upload = Upload::find($upload_id); 
     if ($upload->deleted) 
     throw new Exception("This resource has been deleted."); 

     if ($upload->filename == '') 
     throw new Exception("No downloadable file found. Please email [email protected] for support."); 

     header("Content-Description: File Transfer"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Disposition: attachment; filename={$upload->uploaded_filename};"); 

     readfile("https://s3.amazonaws.com/stackoverflow/uploads/" . $upload->filename); 
     exit; 
    } catch(Exception $e) { 
     return $e->getMessage(); 
    } 
    } 
+6

Cela ne semble pas forcer le téléchargement à partir de S3, mais plutôt de repousser le fichier à partir de S3 via votre serveur Web, ce qui limite les ressources de votre serveur Web pour forcer le téléchargement. – davidjbullock

+0

@davidjbullock Je ne sais pas si c'était le cas ou non, mais c'était un mauvais exemple. J'ai mis à jour mon exemple pour refléter ce que je fais mieux. –

0

Dans la fenêtre de la console de gestion s3, faites un clic droit et choisissez les propriétés.

Cliquez sur les métadonnées.

Cliquez sur ajouter des métadonnées

Key: Content-Disposition Valeur: attachement

Enregistrer. C'est tout.

Voici une image http://i.imgur.com/2PWK3xF.jpg

Questions connexes