Résolu Forcer un téléchargement avec .htaccess sous Chrome

Solutions (10)
Tags :
  • chrome
  • Internet Explorer
  • mp3
  • Programmation
|
Bonjour à tous.

Je possède un site web où je mets en ligne une saga en mp3, c'est à dire une histoires enregistrées et agrémentées d'une ambiance sonore et musicale (la plus célèbre étant "Le donjon de Naheulbeuk), que je crée, et que je propose en téléchargement gratuit.

Jusqu'ici, pour permettre aux personnes de télécharger le fichier directement sans passer par un fastidieux "Enregistrer la cible sous ...", j'intégrais mon fichier dans une archive .zip. Puis j'ai appris qu'il était possible de forcer le téléchargement d'un fichier en .mp3 en ajoutant dans le fichier .htaccess le code suivant :

<Files *.mp3>
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</Files>

Tout fonctionne parfaitement sous Internet Explorer et sous Firefox, par contre, sous Chrome, le navigateur semble ignorer la fonction, puisqu'il me dirige directement vers une page qui lit le fichier en mp3 (comme les autres navigateurs le feraient si je n'avait pas modifier le fichier .htaccess).

Avez-vous une solution à mon problème ?

PS : je sais qu'il existe des méthodes utilisant le php pour forcer un téléchargement, mais je voudrais voir s'il existe une solution utilisant le .htaccess.
Contenus similaires
  • Autres pages sur : forcer telechargement htaccess chrome
Meilleure solution
partage
|
Pas la moindre idée, Chrome intégrant un système de lecture audio/vidéo, il doit prendre la main au lieu de télécharger !

De plus, les informations du "header" sont incomplète dans le htaccess ... Il faut plus de détails pour certaines actions ...

D'où le "force-download" dans mon header PHP !

Mais le script que je t'ai donnée fonctionne :
Test le script ICI avec Chrome, IE, Fx, et Opera ... Tu verras ;) 

Et sinon ça marche niquel sur tous les navigateurs !

Ne pouvant pas t'aider sur le "htacces", je te donne une solution intermédiaire qui fonctionne...

(par contre, mon fichier est vide, t'étonnes pas !)
  • Commenter cette solution |
Score
0
òh
òi
|
Dans ce cas, pourquoi cela fonctionne en PHP et pas en direct avec une règle htaccess ???

Mais bon, le web a ses mystères ;) 

Bonne continuation !
  • Commenter cette réponse |
Score
0
òh
òi
|
Bon, j'ai tout viré, tout repris à zéro, et maintenant, tout fonctionne, bravo RedSux !

Juste pour en remettre une dernière couche sur le .htaccess ;) , je suis retourné voir sur le site où j'ai pris l'info (ici et ), et il semble qu'il n'y ait pas besoin d'ajouter plus d'information ...
  • Commenter cette réponse |
Score
0
òh
òi
|
Le code de mon dernier poste fonctionne ... Enfin, j'ai pas de soucis ...

Là, je vois pas ...
  • Commenter cette réponse |
Score
0
òh
òi
|
Argh, je sais pas ce qu'il s'est passé, mais ça ne marche plus ! Enfin, si, presque, mais c'est encore Chrome qui refuse de téléchager et qui préfère lire ... Je ne sais pas ce qui se passe, mais le code précédent fonctionnait sous tout les navigateurs.
  • Commenter cette réponse |
Score
0
òh
òi
|
Ah ... Attends, j'ai des erreurs !

J'ai tout corrigé :

  1. <?php
  2. $filepath = 'mp3/';
  3. $filename = $_GET['filename'];
  4. $fileext = '.mp3';
  5. $file = $filepath.$filename.$fileext;
  6.  
  7. if (file_exists($file)) {
  8. // Description du contenu
  9. header('Content-Description: File Transfer');
  10. // Type de contenu (forcer le téléchargement)
  11. header('Content-Type: application/octet-stream');
  12. // Encodage du contenu
  13. header('Content-Transfer-Encoding: binary');
  14. // Disposition du contenu (et nom du fichier)
  15. header('Content-disposition: attachment; filename='.$filename.$fileext);
  16. // Taille du contenu
  17. header('Content-Length: '.filesize($file));
  18. // Pas de mise en cache par le navigateur
  19. header('Expires: 0');
  20. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  21. header('Pragma: public');
  22. // Lire le fichier brut
  23. ob_clean();
  24. flush();
  25. readfile($file);
  26. exit;
  27. }
  28. ?>


Tu te soucis pas de l'extension, elle est mise toute seule !
Les fichiers sont dans le répertoire "mp3" (ou autre, renomme le mais change la variable $filepath du coup)

Ensuite, t'appelles juste le script :
download.php?filename=TOTO

et ça téléchargera TOTO.mp3 dans le dossier correspondant !

Voila, et le test avec un fichier plein : ICI
  • Commenter cette réponse |
Score
0
òh
òi
|
Bon, ben le mystère du .htaccess restera insoluble ... Par contre, ton php marche du tonnerre, merci beaucoup.

Rendez-vous sur http://www.retour-a-jelen.net/ pour voir le résultat ;)  !
  • Commenter cette réponse |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par Xzimnut.
  • Commenter cette réponse |
Score
0
òh
òi
|
Merci pour ta réponse, mais ce que je voulais surtout savoir, c'est pourquoi ce code fonctionne sous IE et FF, mais pas sous Chrome ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour,

Premièrement il y a une petite erreur dans ton .htaccess : il manque un "i" à "application" !

  1. <Files *.mp3>
  2. ForceType application/octet-stream
  3. Header set Content-Disposition attachment
  4. </Files>


Et je ne sais pas si c'est bien suffisant, il manque des informations (taille du fichier, nom du fichier, etc.)

Une page PHP qui te fait le header et lit le fichier ça te tente ?

  1. <?php
  2. // Initialisation
  3. $filepath = "mp3\";
  4. $filename = $_GET["filename"];
  5. // Type de contenu (forcer le téléchargement)
  6. header("Content-Type: application/force-download");
  7. // Encodage du contenu
  8. header("Content-Transfer-Encoding: application/octet-stream\n");
  9. // Disposition du contenu (et nom du fichier)
  10. header("Content-disposition: attachment; filename=$filename");
  11. // Taille du contenu
  12. header("Content-Length: ".filesize($filepath. $filename));
  13. // Pas de mise en cache par le navigateur
  14. header("Pragma: no-cache");
  15. header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
  16. header("Expires: 0");
  17. // Lire le fichier brut
  18. readfile($filepath. $filename );
  19. ?>



Quelques explications :

  • $filename = Le nom de ton fichier mp3
  • $filepath = Dossier contenant le fichier mp3

    Du coup, imagine que le script (appelons le download.php) soit à la racine du site.
    Les fichiers audio sont dans le répertoire "mp3" à la racine du site.

    Tu appelles la page : download.php?filename=TOTO.mp3

    Et il te télécharge le fichier.

    Avantage :
  • Les internautes ne savent pas où se trouve réellement ton fichier
  • Tu peux ajouter pleins de sécurités par la suite
  • Tu pourras lister tes mp3 avec du PHP aussi
    etc.

    Vérifie, si ça marche, tant mieux ;) 
    • Commenter cette réponse |

    Ce n'est pas ce que vous cherchiez ?

    Tom's guide dans le monde
    • Allemagne
    • Italie
    • Irlande
    • Royaume Uni
    • Etats Unis
    Suivre Tom's Guide
    Inscrivez-vous à la Newsletter
    • ajouter à twitter
    • ajouter à facebook
    • ajouter un flux RSS