[PHP] forcer le download d'un fichier PDF???

forcer le download d'un fichier PDF??? [PHP] - PHP - Programmation

Marsh Posté le 04-06-2002 à 08:40:24    

salut les amis
 
j'ai une question qui peut paraitre bete (mais dont je n'ai pas trouvé la reponse!!! :D ).
Comment faire pour pemettre le download d'un fichier PDF???
Car si on met un lien direct sur le fihier ce c^ù*$ù^de IE l'ouvre avec acrobat directement!!!!
 
Merci


---------------
L'éternité c'est long... surtout à la fin
Reply

Marsh Posté le 04-06-2002 à 08:40:24   

Reply

Marsh Posté le 04-06-2002 à 09:42:42    

Tu n'as qu'à le compresser, ou sinon tu fais confiance aux internautes qui feront un clic droit et "enregistrer la cible sous". :D
Peut-être qu'il y a moyen en PHP de faire mieux...

Reply

Marsh Posté le 05-06-2002 à 15:36:54    

ouaaaaaaaaaaaaaaaa
trop bonne idéee!!!!!
merci merci merci


---------------
L'éternité c'est long... surtout à la fin
Reply

Marsh Posté le 06-06-2002 à 10:48:24    

salut
il suffit d'envoyer un header specifique : "content-dispostion: attachment"  
voila un exemple :  
----------------------------------------------------------------
$fichier="fichier.pdf";
$fp = fopen($fichier,"r" );
$buff = fread($fp,filesize($fichier));
header("Content-Type: application/x-octet-stream\n" );
header( "Content-Disposition: attachment;filename=$fichier" );
header('Pragma: no-cache';);
header('Expires: 0';);
echo $buff;
fclose($fp);
-------------------------------------------------------
 
 :jap:


Message édité par Ashlar le 06-06-2002 à 10:49:37
Reply

Marsh Posté le 06-06-2002 à 10:53:31    

Ashlar a écrit a écrit :

 
header( "Content-Disposition: attachment;filename=$fichier" );




 
ça marche avec tous les browsers ça?
c'est standard?
si oui merci pour l'info  :hello:

Reply

Marsh Posté le 08-06-2002 à 12:30:13    

heuuu avec IE , NS , Mozilla ; Konqueror -> ok
avec opera : ok MAIS le nom de fichier dans la boite de dialogue est download.php et pas le vrai nom de fichier .(cependant le contenu est bien celui du fichier à downloader hein  , suffit de le renommer)
enfin spa trop grave ca  hein.


Message édité par grognon74 le 06-08-2002 à 12:31:32
Reply

Marsh Posté le 10-06-2002 à 14:39:23    

ET il y aura moyen dans une meme page de choisr lecture ou d/l ?

Reply

Marsh Posté le 10-06-2002 à 14:46:36    

bah heu oui
 
exemple :  
<a href="fichier.pdf">lecture</a><br>
<a href="download.php?fichier=fichier.pdf">Download</a>
 
et voila....
le premier lien ouvira le document dans le browser(si le type de document est ouvrable par le browser)  tandis que le second proposera la boite de dialogue.
 
(avec un .zip par exemple c pas meme pas utile de passer via le lien download , le browser proposera la boite 'sauver sous' lui meme...)

Reply

Marsh Posté le 10-06-2002 à 14:57:56    

Oui mais mes users c pas des informaticiens, alors leur dire de compresser un fichier et de le dedoubler dans le rep :-D
 
Mais je vais faire ta soluce ca me plait

Reply

Marsh Posté le 10-06-2002 à 15:05:20    

Euhh j'ai pas trop reflechie a ton code, j'ai fait un pur copier coller
 
<?
 $fichier="Documentation/departement.xls";
$fp = fopen($fichier,"r" );
$buff = fread($fp,filesize($fichier));
header("Content-Type: application/x-octet-stream\n" );
header( "Content-Disposition: attachment;filename=$fichier" );
header('Pragma: no-cache';);
header('Expires: 0';);
echo $buff;
fclose($fp);
?>
 
et mon ie me donne ca :-)
ÐÏࡱ
 
 
Alors ma question :-)
Ca marche pour tous les fichiers ?
Ton echo $buff je vois pas trop
 
Maintenant si tu me dis que c juste une idée et qu'il faut l'interpreter oki je me reflechirais un peu plus

Reply

Marsh Posté le 10-06-2002 à 15:05:20   

Reply

Marsh Posté le 10-06-2002 à 15:33:42    

mm je viens de faire un test avec les memes conditions que toi
j'ai crée un rep Documentation dans lequel j'ai mis departement.xls.
 
l'appel de download.php me donne bien la boite de dialogue 'sauver-sous' .
Et le fichier sauvé correspond bien au fichier originel.
 
 
Quel os , quel browser , quelles conditions as tu toi?

Reply

Marsh Posté le 10-06-2002 à 15:37:38    

windows 2000 ie6
 
Apache 1.39
php 4.0
Sous win2k
 
Je continue les tests :-)

Reply

Marsh Posté le 10-06-2002 à 15:39:07    

Avec unfichier pdf la ca marche
 
J'ai du faire une boulette sur le premier je continue mes investigation merci bcp de ton aide
 
 
LOL maintenant il veut m'enregistrer simplement le nom de la page :-)
 
doc_dl


Message édité par Sebastien le 06-10-2002 à 15:41:15
Reply

Marsh Posté le 10-06-2002 à 15:44:02    

mm bon pour info , voici comment fonctionne ce script :  
-----------------------------------------------
//  ouverture du fichier en read-only
$fichier="fichier.pdf";
$fp = fopen($fichier,"r" );
 
// on lit le contenu entier du fichier dans la variable //$buff.
//  
 
$buff = fread($fp,filesize($fichier));
 
// la on utilise le fait que PHP puisse generer n'importe //quel type de fichier (pas que du html donc , et meme des //fichiers binaires , c'est le cas ici
// comment fait PHP pour preciser au browser que ce n'est //pas une page HTML qu'il recoit?
// en envoyant un header specifique :  
 
header("Content-Type: application/x-octet-stream\n" );
// la le browser est informé du fait qu'il recoit du binaire //(octet-stream)
 
header( "Content-Disposition: attachment;filename=$fichier" );
// et ici on informe le browser qu'il doit proposer la boite //de dialogue sauver-sous.
 
// les deux headers suivants sont des anti-refresh :)
// le fichier downloadé ne sera pas mis en cache!
header('Pragma: no-cache';);
header('Expires: 0';);
 
// et maintenant quoi?
// PHP doit envoyer les octets au browser
// où sont ces octets? dans la variable $buff!
// donc on demande gentiment à PHP d'afficher le contenu de //cette variable.
// afficher? oui dans un sens , le standard output dans ce //cas ce n'est PAS la fenetre d'affichage du browser mais //bien le fichier en train d'etre downloadé.
echo $buff;
 
// et pour etre propre on ferme la connection fichier //precedement ouverte.
fclose($fp);
 
 
---------------
 
et voila.

Reply

Marsh Posté le 10-06-2002 à 15:47:32    

o lieu d'ouvrir le fichier et de le lire, en 1 instruction tu fais ça : readfile('monfichier';);
Par contre évite les dl.php?monfichier car t'imagine qu'on fasse dl.php?config.inc.php ?

Reply

Marsh Posté le 10-06-2002 à 16:57:24    

bah pour securiser ca il suffit de rajouter :  
 
if (!( ereg("(.doc|.pdf|.xls|.zip)$", $fichier)))
{
Die("Unauthorized file type" );
}
 
en tout debut de script.
 
(remplacer (.doc|.pdf|.xls|.zip) par la liste des extensions que tu veut autoriser en download. )
 
 
 
 
concernant le readfile , ouais c plus simple mais si  
-win32 et version de php < 4.0.5 alors readfile bug lors de lecture de binaires.
tandis que la method fopen-read-close est ok depuis la version 3.

Reply

Marsh Posté le 10-06-2002 à 16:59:31    

Donc revoila les scripts +- sécurisés :
 
 
PHP4 > 4.0.5 :  
------------------------------------------------------
<?
if (!( ereg("(.doc|.pdf|.xls|.zip)$", $fichier)))
{
Die("Unauthorized file type" );
}
header("Content-Type: application/x-octet-stream\n" );
header( "Content-Disposition: attachment;filename=$fichier" );
header('Pragma: no-cache';);
header('Expires: 0';);
readfile($fichier);
?>
 
 
----------------------------- x-----------------------
 
php  < 4.0.5 :  
 
-----------------------------------------
<?
if (!( ereg("(.doc|.pdf|.xls|.zip)$", $fichier)))
{
Die("Unauthorized file type" );
}
$fp = fopen($fichier,"r" );
$buff = fread($fp,filesize($fichier));
header("Content-Type: application/x-octet-stream\n" );
header( "Content-Disposition: attachment;filename=$fichier" );
header('Pragma: no-cache';);
header('Expires: 0';);
echo $buff;
fclose($fp);
?>
-------------------------- x ----------------------

Reply

Marsh Posté le 10-06-2002 à 17:30:57    

heu j'ai juste oublier un ptit truc  
remplacer "ereg" par "eregi"  
comme ca , c'est case insensitive  
 
  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed