2010-02-01 8 views
4

Supposons que j'ai un fichier sur un CDN (Cloud Files from Rackspace) et une page html statique avec un lien vers ce fichier. Est-il possible de forcer le téléchargement de ce fichier (pour l'empêcher de s'ouvrir dans le navigateur - pour les mp3 par exemple)?Forcer le téléchargement via le balisage ou JS

Nous pourrions faire notre serveur lire le fichier et définissez l'en-tête correspondant:

header("Content-Type: application/force-download") 

mais nous avons environ 5 millions de téléchargements par mois afin que nous préférons laisser le soin prendre CDN de cela.

Des idées?

+2

Il n'y a pas de 'application/force-download'. Utilisez 'application/octet-stream' à la place. – Gumbo

+1

Merci, maintenant que j'y pense, la question n'a pas de sens. Il n'y a aucun moyen qu'un navigateur me laisse définir quel fichier doit être sauvegardé et lequel ne l'est pas à moins que j'aie accès aux en-têtes. –

+1

Essayer de forcer le téléchargement en utilisant le type de contenu est un hack. Utilisez Content-Disposition à la place. – Quentin

Répondre

5

Il n'y a aucun moyen de le faire en HTML ou JavaScript.There is now! (Ish. See @BruceAldrige’s answer below.)

L'en-tête HTTP Content-Disposition indique aux navigateurs de télécharger les fichiers, qui sont envoyés par le serveur. Vous devez configurer le CDN pour envoyer cet en-tête avec les fichiers que vous voulez que le navigateur télécharge au lieu de l'afficher. Malheureusement, je ne suis pas du tout familier avec le service Cloud Files de Rackspace, donc je ne sais pas s'ils l'autorisent, ni comment le faire. Juste trouvé une page de Décembre 2009 qui suggère ne pas pensé, malheureusement:

Cloud Les fichiers ne peuvent pas servir un fichier avec l'en-tête HTTP 'Content-Disposition: attachment'. Par conséquent, un lien de téléchargement qui fonctionnerait parfaitement dans un autre service peut entraîner le rendu direct du fichier par le navigateur. Cela a été confirmé par les ingénieurs de Rackspace. :-(

http://drupal.org/node/656714

Je sais que vous pouvez avec le service CloudFront d'Amazon, comme il est soutenu par S3 (voir par exemple http://blog.cloudberrylab.com/2009/06/how-to-set-custom-http-headers-for.html)

+0

Oui, il est trop tard pour passer à S3 maintenant. Merci pour la réponse de toute façon. –

0

Une idée folle: téléchargement via XMLHttpRequest et servir une URL data: avec le type de contenu que vous voulez?: P

1

Oui, vous pouvez le faire via l'API cloudfiles.Utiliser le flux de la méthode vous permet de diffuser le contenu des fichiers dans - la définition de vos propres en-têtes, etc