forcer le download d'un fichier PDF??? [PHP] - PHP - Programmation
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".
Peut-être qu'il y a moyen en PHP de faire mieux...
Marsh Posté le 05-06-2002 à 15:36:54
ouaaaaaaaaaaaaaaaa
trop bonne idéee!!!!!
merci merci merci
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);
-------------------------------------------------------
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
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.
Marsh Posté le 10-06-2002 à 14:39:23
ET il y aura moyen dans une meme page de choisr lecture ou d/l ?
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...)
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
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
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?
Marsh Posté le 10-06-2002 à 15:37:38
windows 2000 ie6
Apache 1.39
php 4.0
Sous win2k
Je continue les tests :-)
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
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.
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 ?
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.
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 ----------------------
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
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!!! ).
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