Force-Télécharger avec php sur Amazon S3
Je suis en train d'utiliser http://code.google.com/p/amazon-s3-php-class/ à force de télécharger des fichiers à partir d'AWS S3. J'ai un mp3 que je veux que les gens de "jouer" ou "télécharger". Par défaut lorsque vous accédez au fichier directement sur le s3, il commence à jouer dans le navigateur. J'ai besoin d'ajouter une option pour télécharger. J'ai Googlé et trouvé est venu avec rien. Je conceptuellement savoir ce qui doit se produire, mais ne sais pas comment le produire php. Je sais que j'ai besoin de modifier les en-têtes Content-Disposition: attachment. Toute aide serait grandement appréciée.
Grâce,
Michael
source d'informationauteur michaelespinosa | 2009-05-15
Vous devez vous connecter pour publier un commentaire.
Les scripts php qui ont été mentionnées ci-dessus va travailler ok, mais le principal inconvénient est que chaque fois qu'un visiteur de votre site demande un fichier, vos propres serveurs pour le charger à partir de la S3 et ensuite le relais que les données dans le navigateur. Pour les sites à faible trafic, ce n'est probablement pas une grosse affaire, mais pour le trafic élevé, vous voulez certainement pour éviter de mettre le tout par le biais de vos propres serveurs.
Heureusement, il ya une assez simple façon de mettre vos fichiers à être forcés à télécharger à partir de la S3. Et vous avez tout à fait raison, mais juste pour définir le content-type et content-disposition (juste réglage de contenu-disposition de l'œuvre dans certains navigateurs, mais mettre les deux devraient travailler dans tous les navigateurs).
Ce code est en supposant que vous utilisez Amazon S3 classe PHP de Undesigned:
Maintenant, tous vos fichiers seront forcés à télécharger. Vous pouvez avoir besoin de vider votre cache pour voir le changement. Et évidemment, ne pas le faire sur n'importe quel fichier que vous avez réellement ne voulez être chargé "inline" dans le navigateur.
La part belle avec cette solution est que les applications qui se chargent des fichiers multimédia directement (comme disons un lecteur mp3 en Flash) ne se soucient pas le type de contenu ou content-disposition, de sorte que vous pouvez toujours jouer vos fichiers dans le navigateur, puis lien pour télécharger le même fichier. Si l'utilisateur a déjà fini de charger le fichier en flash, ils aurez plus de chances en ont encore dans leur cache, ce qui signifie que leur téléchargement va être super rapide et il ne sera même pas vous coûter supplémentaire de frais de bande passante à partir de la S3.
Amazon a maintenant résolu ce problème et permet d'écraser les en-têtes sur une demande de base à la signature des demandes:
http://docs.amazonwebservices.com/AmazonS3/latest/API/index.html?RESTObjectGET.html
w00t!
Juste ajouter ceci à votre fichier de métadonnées sur s3:
Juste envie de poster une contribution, Alex Neth est correcte sur cette référence, mais je ne me sens pas un lien suffisamment d'information, à l'aide de amazon AWS PHP SDK2. Ci-dessous, j'ai décrit une base (non testé) méthode pour appeler les données de cette façon, vous pouvez utiliser S3 Méthode de Fabrique ou de Service AWS Builder pour créer le S3 Client.
Vous pouvez ensuite utiliser PHP header("location: $url"); afin de rediriger le visiteur vers le fichier MP3 avec une force de téléchargement, ce qui devrait éviter de jouer dans le navigateur, Veuillez noter que j'utilise ResponseContentType assez souvent, mais je n'ai jamais utilisé ResponseContentDisposition avec AWS (il devrait fonctionner selon les docs).
La conversion de cet échantillon dans une fonction devrait être plus facile, vous pouvez même passer en $seau, $key, $force_download en tant que tel
Attention, si vous n'avez pas compris, ce qui exige l'AWS SDK PHP 2 actuellement (7 avril 2014) trouvé ici http://aws.amazon.com/sdkforphp/ Ce code est surtout de pseudo-code peut nécessiter certaines de peaufinage pour réellement faire le travail que je suis le référencement de ce à partir de la mémoire.
Donc modifier mon exemple ci-dessus pour être comme cela
Maintenant, vous voulez mettre la validation de certains là-bas, alors que vous ne donnant pas le monde, l'accès à tous les fichiers que vous mettez sur le S3, mais cela devrait fonctionner.
Si vous utilisez une bibliothèque comme Tarzan AWSvous pouvez ajouter des méta-têtes, que amazon va inclure lorsque le fichier est extrait. Découvrez les méta-paramètre dans la update_object fonction ici, par exemple:
http://tarzan-aws.com/docs/2.0/files/s3-class-php.html#AmazonS3.update_object
Il convient également de mentionner vous êtes en mesure de dur-définir les en-têtes des fichiers dans S3. Par exemple, si vous avez besoin de la force de téléchargement de fichiers vous pouvez définir les en-têtes appropriés pour ce fichier. Comme défaillant à flot, et la présence d'un fichier secondaire mis à la force de téléchargement ou de passer de la bande passante à utiliser php/fputs et la force de téléchargement via PHP.
Le code ci-dessus fonctionne, il faut juste installer le S3 compositeur de dépendance et un lien dans le fichier autoload, mettez votre clé/secret dans config et ensuite fournir le seau/nom de fichier.
php il suffit de télécharger le fichier sur le serveur, pas le client. rappelez-vous, php n'est pas faire n'importe quoi sur le client, elle retourne le contenu (html, javascript, css, xml, etc...)
[edit: ajouté pour la clarté]: php peut servir de contenu audio, mais vous voulez servir une page web et audio en même temps. Pour obtenir que le comportement du client, vous avez à prendre le client pour demander le fichier basé sur le web de la page html ou javascript.
De sorte que vous avez à obtenir le client à télécharger le fichier. Par exemple, avoir un iframe sur la page avec l'url du fichier sur le s3. Utiliser les css pour faire de l'iframe invisible. Elle devrait rendre la page et de télécharger et lire le mp3.
Sinon, regarde dans l'aide de javascript pour le coup de téléchargement lorsque le chargement de la page. Je ne sais pas si c'est possible.
C'est désormais possible en écrasant la S3 en-têtes à l'aide de signé demandes.
Donc, vous devez définir ces en-têtes:
Trouvé de réponse ici: https://stackoverflow.com/a/5903710/922522
Je n'ai jamais essayé d'Amazon S3 hébergement, mais vous n'avez pas accès à l'aide .htaccess? Ensuite, vous pouvez définir le Content-Type et Content-Disposition pour l'ensemble d'un répertoire avec cette entrée: