Salut
J'ai un problème, j'ai une application (intranet pour l'instant, peut-être internet plus tard) sur le serveur de l'entreprise, je bosse dessus via ftp donc (je précise car je ne sais pas si ça a un lien).
Les utilisateurs de l'entreprise se connectent sur l'intranet et accèdent à l'appli.
Il y a un bouton qui permet d'extraire les données sous format csv, ok, cependant je n'arrive pas à faire télécharger le fichier par mon navigateur malgré tous les exemples que j'ai pu trouver sur internet, ex :
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
Merci d'avance
Il se passe quoi ?
Rien justement, je voudrais que le fichier soit téléchargé par le navigateur mais rien ne se passe
Déjà, ton content type n'est pas bon :header('Content-Type: image/gif');
Apres, t'as essayé de voir ce que retourne file_exists
?
Edit: Et le exit
a la fin...
Oui le file_exists trouve renvoie true
Après cet exemple est celui que j'ai trouvé sur la doc php http://php.net/manual/fr/function.readfile.php, à l'origine je souhaite exporter un tableau dans un fichier csv récupérable
J'ai aussi vérifié avec d'autres navigateurs que chrome, rien ne se passe
Donne nous ton code a toi
Sur js fiddle de préférence, ou au moins entre les balises <code>
Il n'y a rien de plus que dans la doc, le script est dans un fichier php sur le serveur, l'image également
J'avais modifié "header('Content-Type: image/gif');" mais ça ne fonctionne pas non plus
<?php
$file = '../files/images/logo.jpg';
echo var_dump(file_exists($file)); //renvoie bien true
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
Je suppose que le problème vient du fait que le projet soit sur un serveur distant ?
Je viens de faire le test sur un serveur (distant) et en local
<?php
function fnc_path($string) {
return str_replace(["/", "\\"], DIRECTORY_SEPARATOR, $string);
}
$file = fnc_path( dirname(__DIR__).'/files/images/logo.jpg' );
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: image/jpg');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
Ca fonctionne très bien.
edit: var_dump affiche les informations d'une variable, pas de besoin de faire un echo en plus.
edit2: Le content-type doit etre du type de ton fichier, dans ton premier code c'est un gif mais dans ta deuxieme version c'est un jpg.
Ok en fait ça n'a pas l'air de fonctionner car j'appelle le fichier php avec du ajax, si je cherche à accéder au fichier à la main ton code le télécharge
Je vais chercher sur cette voie merci !
Edit: et merci pour les infos dans les edits je ne savais pas
Pour le faire en ajax c'est super simple, j'ai modifié le script php pour avoir un peut plus de souplesse.
download.php : http://pastebin.com/Rw9za65r
html + javascript : http://pastebin.com/XWTgPmy6
Si tu utilise jquery c'est le meme principe ( c'est plus court a écrire par contre ). Si tu ne comprends pas certains passages, n'hésites pas.
P.S : La partie php n'est pas sécurisée
Ouaip c'est bon ça fonctionne merci
Je n'ai juste pas compris pourquoi la partie php n'est pas sécurisée ?
Je ne suis pas un pro de la sécurité, mais la premère chose a savoir c'est qu'il ne faut jamais faire confiance aux données qui proviennent de l'utilisateur.
Les seules vérifications qui sont faites sont :
- Vérifier que le nom de fichier est bien renseigné
- Vérifier que le fichier existe
En fonction de l'architecture de tes dossiers, ca laisse la porte ouverte a pas mal d'abus, notement celui de télécharger autre chose que les images.
Je pense que la première chose a faire est de vérifier l'extension du fichier que l'utilisateur souhaite télécharger (pas de fichiers php par exemple).
Deuxieme chose, limiter l'argument file a un nom de fichier seul (pas de chemins relatifs ou absolus).
Je t'ai fait un exemple ici : http://pastebin.com/cJRefLLY
J'ai ajouté une fonction qui permet de valider le nom du fichier passé en argument.
edit: il y a une faute dans un des commentaires
//si l'extension du fichier n'est pas le tableau des extensions autorisés
qui devrait etre
//si l'extension du fichier n'est pas 'dans''' le tableau des extensions autorisés''