Rechercher : dans
Par :

[PhP] Forcer le download.

Dernière réponse le 26 aoû 2009 à 18:08:23 Zep3k!GnO, le 27 mar 2006 à 10:36:58 
 Signaler ce message aux modérateurs

Bonjour à tous.
Je voulais savoir comment on fait en PhP pour forcer l'utilisateur à télécharger un document (mon cas un PDF).
Que lorsque l'on clic sur le lien, on ait l'invite de télécharegement qui s'affiche.
Je sais que c'est avec des hearders mais je ne me souviens plus bien...
Merci à vous ! Zep3k!GnO

On est des rangers mec, des rangers...

Meilleures réponses pour « [PhP] Forcer le download. » dans :
Enregistrer une vidéo en streaming (Youtube, Dailymotion...) VoirDe plus en plus de sites diffusent du contenu vidéo en streaming, c'est-à-dire en diffusion à la demande. Ainsi, il est nécessaire d'être connecté pour pouvoir en lire le contenu, voire de se connecter à partir de la page diffusant le contenu...
Installation rapide de LAMP (Apache+MySql+php) sous Linux VoirLAMP = Linux+Apache+MySql+Php. C'est le serveur web par excellence. L'ensemble est facile à installer. Installation rapide sudo aptitude install apache2 php5 mysql-server php5-mysql libapache2-mod-php5 Le mot de passe administrateur mySQL...
[Joomla] Supprimer Forcer SSL depuis DB VoirProblème Je souhaite supprimer la fonction Forcer SSL de Joomla depuis la base de donnée... Hélas, mon hébergeur ne supporte pas cette fonctionnalité ! Solution Dans le fichier configuration.php, le paramètre var $force_ssl doit être 0. Source
PHP - Récupération de données VoirPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
PHP - Les variables VoirConcept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...

1

kilian, le 27 mar 2006 à 11:04:36
  • +1

Je crois que c\'est une chose qui ne concerne que le navigateur en fonction du type MIME du document qu\'on lui propose.

Si par exemple un serveur lui envoie un document possédant le type MIME d\'un pdf et que le navigateur inclut la lecture des pdf alors celui -ci le lira directement, par contre pour un type MIME qu\'il ne sait pas traiter il proposera le téléchargement.

Une solution pour pallier à ça serait de donner le type MIME
application/octet-stream (grâce à la fonction header justement):

header('Content-Type: application/octet-stream')
puis d\'envoyer le pdf mais il faut que la personne en face sache comment l\'ouvrir une fois téléchargé...

Répondre à kilian

2

Luffy =), le 27 mar 2006 à 11:08:47

Salut =)

Il me semble que tu peux le faire avec le code :
header('Content-Disposition: attachment; filename="document.pdf"');

++ Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

3

Zep3k!GnO, le 27 mar 2006 à 11:18:23

Okay bin je testerai ça et je dirai si j'ai des soushis :D
MErci Zep3k!GnO

On est des rangers mec, des rangers...

Répondre à Zep3k!GnO

4

boulinette, le 29 mar 2006 à 09:53:49
  • +5

<a href="download-doc.php?file=ton_fichier">telecharger </a>

Tom fichier download

La var file c'est ton fichier

<?
$file=$_GET['file'];

//telechargement
$taille=filesize("doc/$file");
header("Content-Type: application/force-download; name=\"$file\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $taille");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("doc/$file");
exit();
?>

Répondre à boulinette

5

Zep3k!GnO, le 29 mar 2006 à 10:09:26

Yep, merci , c'est le post ou t'avais mis ca que je ne retrouvait plus... Merci beaucoup :D
Bonne journée. Zep3k!GnO

On est des rangers mec, des rangers...

Répondre à Zep3k!GnO

16

liliana23info, le 4 jun 2009 à 19:35:25

Salut?stp tu peux m'aider en php?

Répondre à liliana23info

9

masternico, le 15 sep 2008 à 22:23:29

Salut boulinette. Merci pour ton script.
Le "binary" dans la clause "transfert-encoding" me résout mon propblème.

Répondre à masternico

6

geek1983, le 18 fév 2008 à 18:07:04

Pour ceux qui inclue force-download.php à leur script et qui ont le problème de la page blanche après l'exécution de force-download.php la solution est de l'appeler via un iframe invisible.

Ex: echo '<iframe style="display:none" src="download.php?file='.$file.'&event='.$event_name.'"></iframe>';

Répondre à geek1983

7

A. nonyme, le 13 mar 2008 à 13:31:46

Bonjour,

Je voulais utiliser un code similaire à celui-ci dessus pour crée un fichier téléchargeable et ca en temp réel, je connais d'avance la taille final (on va dire 750ko pour l'exemple) donc je l'indique dans l'header ainsi que le nom.

J'ai volontairement mis seulement un readfile avec un fichier plus petit (on va prendre par exemple 500ko) que le resultat final pour simuler une erreur ou bug de programmation dans l'une des routines de création à la volée.

Lorsque IE commence le téléchargement, il m'affiche la taille et le nom voulu par les header, il commence à telecharger les 500 premiers ko, il s'arrete mais au lieu d'afficher une erreur, il fait comme s'il avait réussi à télécharger le fichier sauf qu'il fait 500ko alors qu'il avait annoncé 750ko au démarrage du téléchargement.

Est-ce qu'il y a un moyen d'éviter qu'un telechargement incomplet pour cause de plantage soit affiché comme réussi ? (un peu comme quand la connexion est interrompue)

Est-ce une précision dans l'header qui force la verification ? Est-ce qu'il faut envoyer quelques choses pour signaler l'erreur ?

Merci d'avance.

Répondre à A. nonyme

8

dfgsfhgsfgh, le 10 avr 2008 à 11:29:57

Pourriez vous m'aider a les telechager

Répondre à dfgsfhgsfgh

10

zig, le 9 déc 2008 à 21:48:30
  • +4

Crétin!

Répondre à zig

11

P-Y, le 12 déc 2008 à 00:02:06
  • +14

Le script mentionné ci-dessus est TRÈS INSÉCURE

Si par exemple on se trouve sur un serveur linux, il suffit de lui passer, par exemple,la valeur "../../../../../../etc/passwd" pour downloader le fichier /etc/passwd... On peut virtuellement accéder à n'importe lequel fichier du serveur à l'aide de ce script.

Utiliser plutot ce script, qui utilise basename() afin de se limiter aux fichiers du répertoire local, par exemple.

<?php
$file=$_GET['file'];

if (($file != "") && (file_exists("./" . basename($file))))
{
$size = filesize("./" . basename($file));
header("Content-Type: application/force-download; name=\"" . basename($file) . "\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("./" . basename($file));
exit();
}
?>

Répondre à P-Y

12

masternico, le 12 déc 2008 à 00:19:19

100% d'accord...

Répondre à masternico

13

kelsett, le 21 mai 2009 à 21:55:21

Bonsoir,

Je cherchais depuis un petit moment comment faire ça, et ce script fonctionne merveilleusement bien... sous Chrome. Sous Internet Explorer lorsque le téléchargement est censé commencer, le navigateur affiche un message : "Internet Explorer a bloqué le téléchargement de fichiers... {etc}" et sous Firefox il y a l'habituel "Voulez vous enregistrer ce fichier" etc.

Y a t'il une meilleure technique ?

Merci

Répondre à kelsett

14

Armoric, le 4 jun 2009 à 14:56:14

Après test du code qui ne fonctionne pas sur IE chez moi non plus, voici ce que j'ai trouvé en fouinant à peine et qui fonctionne tant sur Fx qu'IE :

<? 
$dir="/path/to/file/";
if (isset($_REQUEST["file"])) {
    $file=$dir.$_REQUEST["file"];
    header("Content-type: application/force-download");
    header("Content-Transfer-Encoding: Binary");
    header("Content-length: ".filesize($file));
    header("Content-disposition: attachment; filename=\"".basename($file)."\"");
    readfile("$file");
} else {
    echo "No file selected";
}
 ?> 


Trouvé sur http://www.higherpass.com/php/Tutorials/File-Download-Security/.

Répondre à Armoric

15

kelsett, le 4 jun 2009 à 19:05:26

Non désolé ^^ ce code ne fonctionne pas non plus, ou peut être sur les anciennes versions mais sur IE8 ou Firefox 3 cela ne fonctionne pas, ca présente toujours la fenêtre de demande de téléchargement.

Répondre à kelsett

17

masternico, le 4 jun 2009 à 21:04:54
  • +1

Bonsoir,
je crois qu'il serait bon de répéter certaines choses importantes qui, semblerait-il, passent inaperçues aux yeux de beaucoup de gents:
ce genre de script est à bannir car il présente un énorme risque de sécurité. Pour illustrer mon propos, prenons un petit exemple.
Si l'on regarde attentivement au script montré orgueilleusement par notre ami armoric nous pouvons constater un gros problème. La variable qui contient le nom du fichier est dans l'argument $_REQUEST['file'].
Donc si l'on veut télécharger le fichier 'blabla.pdf' il suffit de faire l'appel à la page de la manière suivante:
download_file.php?file=blabla.pdf

jusque là, tout va bien dans le meilleur des mondes.
Problème... c'est qu'Internet n'est pas le meilleur des mondes. Bien au contraire, c'est un lieu où se tapissent les pires loups qui attendent la brebis égarée.

En termes concrêt voici ce qu'un hacker peux faire avec ce superbe script présenté plus haut (en supposant que le répertoire de stockage est /documents/downloads/

on commence par:
download_file.php?file=index.php
Pas de résultats, c'est que la racine du site est plus haut dans l'arborescence
donc on recommence avec un niveau supérieur:
download_file.php?file=../index.php
Toujours pas de résultats, on continue:
download_file.php?file=../../index.php
BINGO!!! je récupère le fichier index.php du site. En auscultant le code, je peux y trouver les chemins d'accès aux fichiers de configurations d'accès à la base de données... qu'il me suffira de donner en argument au merveilleux script dont nous parlons.

Ce qui fait que en moins de 5mn, j'ai parcouru l'arboresence du site et j'ai tous les codes d'accès à la base de données.

Merci... super code...

Pour ceux que ça intéresse, j'ai crée une source php facilement implémentable dans tout site voulant ajouter la fonction de téléchargement de fichier. Il s'agit d'un mécanisme de jetons avec lesquels vous donner accès à un fichier par l'intermédiaire d'un lien de téléchargement codé. Il n'est pas possible de télécharger autre chose que ce qui est mis à disposition et même si quelqu'un s'amuse à jouer avec les numéros de jetons tout ce qu'il pourra obtenir après de nombreuses tentatives, c'est un fichier qui était programmé au téléchargement. Donc pas de risques de sécurités.

Le script peut être téléchargé à l'adresse suivante:

http://www.phpcs.com//code.aspx?ID=48434


Cordialement

Répondre à masternico

18

kelsett, le 4 jun 2009 à 22:34:07

Bien sûr, il faut réfléchir avant d'utiliser ce code, ce que tu as cité n'est qu'un exemple parmi tant d'autres car il est évidemment possible de provoquer beaucoup plus de dégâts que ce que tu as dit (je pense notamment au téléchargement forcé de virus/trojans et autres... imagine un bot téléchargé par plusieurs milliers de personnes, le hacker se verrait en mesure d'attaquer de plus gros sites) et il est évident qu'il faut sécuriser ce script pour ne pouvoir accéder qu'à certains fichiers/dossiers/extensions.

Répondre à kelsett

19

Armoric, le 18 jun 2009 à 16:32:48

C'est bien ça : le problème est que le script ne fonctionnait pas sous IE au niveau des headers, visiblement, j'ai fait profiter d'une source que j'avais trouvée et qui effectivement fonctionnait chez moi (Fx 3.0.11 et IE...6.0, j'avoue, je ne m'en sers pas vraiment) pour indiquer quels headers semblaient les bons, mais je pensais évident que tout l'enrobage est fonction de ce qu'on veut en faire ensuite.
Cela dit, j'aurais peut-être dû préciser qu'utiliser des variables POST est un minimum (et encore...) pour les débutants, oui.

Répondre à Armoric

20

masternico, le 18 jun 2009 à 19:15:41

Même... en POST le problème persiste:
J'ai juste à faire une page avec deux frames dont une que j'utilise pour afficher une page de ton site (index par exemple).
Du coup, comme j'ai la main sur la page de ton site (d'une frame à l'autre je peux faire ce que je veux), j'y rajoute un script d'appel ajax (le tout se passe en interne sur mon ordi. Je ne touche à rien sur la page d'origine qui se trouve sur le serveur).
Ensuite, comme la page de ton site est autorisée a effectuer une requette ajax sur ton site (normal), je déclenche la procédure qui se charge d'envoyer une requette POST avec les paramètres d'appels qu'il faut pour demander à télécharger n'importe quel fichier de ton site.
Le retour se fait aussi grâce la page de ton site que j'ai modifiée. La seule différence, c'est qu'au lieu que mon navigateur n'interprète la page HTML que je reçois en retour, c'est à moi de la décoder. Mais là encore, rien de bien sorcier:
j'ouvre une popup et j'y écris tout simplement ce que je reçois de ton site... donc la popup me propose ton fichier en téléchargement...

C'est le BABA du Xsite-scripting (cross-site scriping)

Les mains dans le nez, les doigts dans les poches...

Répondre à masternico

21

IncludE, le 24 jun 2009 à 13:43:14

En effet, le script reste par lui même fonctionnel !

Comme le dit masternico, il sera très simple de passer n'importe quel fichier en paramètre. Et même les fichiers .htaccess / .htpasswd / .htgroup / robot.txt !!! Oui le readfile de php étant natif et possédant les droits de lecture, il permettra de lire n'importe quel fichier dant le documentRoot du site.

Ne jamais passer de nom de dossier dans la variable, et au contraire placer en dur le répertoire où se trouve le(s) fichier(s) a télécharger dans le script php et de bien contrôler l'existance de la ressource à délivrer.

Autre point, je cherche à ce que GG Analytics puisse 'tracker' les fichiers downloadés !!
Qq. à t-il une idée ?

Il me vient l'idée de forcer le download via HTML à partir d'un meta refresh et donc de placer le code GGAT dans la page ...

Répondre à IncludE

22

kelsett, le 2 jui 2009 à 11:24:35

Il me vient l'idée de forcer le download via HTML à partir d'un meta refresh et donc de placer le code GGAT dans la page ...

Oui, ou alors peut être ajouter automatiquement l'url de tes fichiers sur ton plan de site...

Répondre à kelsett

23

ju0123456789, le 10 jui 2009 à 15:28:08
  • +1

Bonjour !

ça marche avec des PDF, mais avec des JPG par exemple ? j'arrive pas a faire marcher !!!
J'utilise :
$fichier = "monchemin_/classement.xjpg;
header("Content-type: application/force-download");
header("Content-disposition: attachment; filename=$fichier");

Pour certains c'est une méthode à l'arrache, mais on ne pourra pas aller dans ma BDD, car les code de connexion sont dans un include caché (ne me demandez pas comment j'ai fait c'est mon chef de projet qui a gérer ça.. trop compliqué pour moi lol)

Et ça marche trs bien sous IE8, mais uniquement avec les PDF, j'ai testé avec un XLS et un JPG et les fichiers que je téléchargent sont vides... :(

Quelqu'un connait-il le problème ?

Merci

Ju'

Répondre à ju0123456789

24

ju0123456789, le 10 jui 2009 à 17:11:22
  • +1

Bon en fait j'ai trouvé mon problème,

C'est tout simplement parceque j'ai eu de la chance avec le PDF ... ^^ ça ne marchais pas avec les autres types de fichiers car j'avais laissé des balises HTML trainé et un include intégrant du HTML.

Maintenant ça marche mieux :)

Donc voilà je transmets, au cas où ça pourrait aider quelqu'un ;)

Répondre à ju0123456789

25

ambro, le 5 aoû 2009 à 13:56:55

Pourriez-vous m'envoyer l'intégralité votre script final pour le téléchargement des fichiers sur Internet ?

Répondre à ambro
Collection CommentÇaMarche.net