[RESOLU] Forcer le téléchargement dans php mail() ?

Eléphant du PHP | 135 Messages

15 mai 2019, 05:04

COUIN !!!!

Je suis confronté à un petit souci sans gravité masi un peu gênant.

En effet, j’ai un formulaire pour qu'un visiteur du site puisse soumettre une musique pour une webradio.
A ce jour, dans le panneau d'admin du site, sont listées toutes les musiques déjà soumises, ainsi que le lien pour télécharger le fichier envoyé par l'auditeur.
Le propriétaire de la webradio pensant rarement à aller voir cette partie de l'admin, l'idée étant de lui notifier par email, qu'une musique a été soumise, avec possibilité de télécharger directement le fichier audio.

Le souci est au niveau du lien de téléchargement, la musique est lue dans le navigateur (webmail) au lieu d'être téléchargée.

J'ai donc rajouté l'option download (que j'ai déjà utilisé sur d'aurtes pages php pour télécharger des fichiers depuis le site) dans le lien :

Code : Tout sélectionner

<a href="http://site.fr/musique.mp3" download="http://site.fr/musique.mp3" style="color:blue"><u>Télécharger le fichier</u></a>
Malheureusement, cela ne fonctionne pas dans le cas d'une consultation du mail sur le webmail. La musique est toujours jouée au lieu d'être téléchargée.
D'ailleurs, sur le code source du message dans le webmail, l'option download a disparu (et target=_blank est apparu).

Si quelqu'un a une petite idée, je serais volontiers preneur :)

Merkouin :)
Un Couin vaut mieux que Deux tu couineras :D

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8112 Messages

15 mai 2019, 08:33

Normalement tu peux demander à Apache (le serveur web) d'indiquer en entête au navigateur que les fichiers mp3 doivent être téléchargés.

Voici ce qu'il faut mettre dans un fichier .htaccess :

Code : Tout sélectionner

<FilesMatch "\.mp3$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch>
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 135 Messages

15 mai 2019, 15:17

Hello,

Merci pour ta réponse.

Malheureusement cela me provoque une erreur 500 lorsque directive mise en place.

J'ai fouillé dans ce sens un peu partout, je retombe soit sur les mèmes syntaxes, soit d'autres syntaxes qui ne plantent pas le serveur mais qui ne provoquent pas le téléchargement forcé.

Aussi, je pense que ça risque de poser souci car les fichiers audio de ce même répertoire doivent pouvoir être lus depuis le site (c'est vrai que j'ai pas pensé à préciser car je pensais pas qu'il était possible de forcer un téléchargement via un htaccess dans un répertoire).

M'ciiii :)
Un Couin vaut mieux que Deux tu couineras :D

Mammouth du PHP | 1531 Messages

15 mai 2019, 16:18

et simplement demander de faire un clique droit "enregistrer la cible sous " dans le mail ?

sinon je chercherai vers une page php qui prendrait en paramètre le nom du fichier et qui pourrait transmettre les headers necessaire au forcement de téléchargement. mais c'est sans certitude.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8112 Messages

15 mai 2019, 18:11

Erreur 500 => regarde dans les logs du serveur pour en savoir davantage sur ce qui l'a provoqué
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 135 Messages

15 mai 2019, 20:43

Re,

Oui pour le moment il y a la mention Clic droit enregistrer sous à coté du lien dans le mail. Je vais voir pour une page de redir, pas bête.

En effet, bonne idée pour les logs, j’irais voir ca aussi (bon ce soir c’est un peu cuitos car préparage pour aller bouloter lol )
Un Couin vaut mieux que Deux tu couineras :D

Eléphant du PHP | 135 Messages

16 mai 2019, 15:45

Plop !

Alors je suis donc parti sur une page de download (script qui pourra me resservir pour plus tard).

Dans un premier temps , j’ai ajouté une fonction glanée sur le net pour convertir le nom de fichier en hexa (et donc éviter les problèmes d'espaces et autres dans le lien généré) :

Code : Tout sélectionner

function String2Hex($string){ $hex=''; for ($i=0; $i < strlen($string); $i++){ $hex .= dechex(ord($string[$i])); } return $hex; } $track = String2Hex($_POST['track']); $url = "http://nom_de_domaine/discotheque/submit/uploads/download.php?file=$track";
Puis une page download.php :

Code : Tout sélectionner

function Hex2String($hex){ $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2){ $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } $file = Hex2String($_GET['file']); if (!file_exists($file) ) { header('Content-type: text/html; charset=utf-8'); echo $file; echo "<br>Le fichier n'existe pas"; exit; } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize(basename($file))); ob_clean(); flush(); readfile(basename($file));
Hormis le fait qu'un nom de fichier ayant " dedans, fasse des étrangetés (mais pas un problème, je rajouterais un substr dans le form d'envoi de titre pour remplacer le double quote par 2 simples quotes), cela fonctionne comme il faut depuis le webmail.

Merkouin à vous :)
Un Couin vaut mieux que Deux tu couineras :D

Avatar du membre
Eléphanteau du PHP | 18 Messages

17 mai 2019, 00:17

sinon , essaye peu être , de mettre un lien qui ouvre une nouvelle fenetre vers un fichier php (pour sortir du webmail) , et qui ensuite fait un redirect au chargement de la page et qui force le téléchargement du fichier.mp3
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 135 Messages

17 mai 2019, 14:09

Hello

C'est le cas, dans le mail, un lien vers une page du site qui va lancer le téléchargement :)

Bon OuiK
Un Couin vaut mieux que Deux tu couineras :D

Avatar du membre
Eléphanteau du PHP | 18 Messages

17 mai 2019, 14:36

oui , j'ai lu un peu (trop) vite le dernier post... il était tard... ;-)
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 135 Messages

17 mai 2019, 15:03

Ca m'arrive aussi lol
Un Couin vaut mieux que Deux tu couineras :D