Aller au contenu

Download de PDF en php


lorik

Sujets conseillés

Bonjour,

Je cherche à réaliser un script a priori simple : downloader et enregistrer automatiquement sur mon serveur un fichier pdf distant.

$test=fopen("http://www.site.com/sfichier.pdf","r");
$contenu=fread($test, $taille);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
//header("Content-Type: application/download");
header("Content-Transfer-Encoding: binary");
readfile('$contenu);

J'arrive à rien, une bouillie immonde envahie mon écran, beuark ! :sick:

J'ai aussi essayé d'enregistrer les contenus dans un fichier, sans plus de succès...

touch('dest.pdf'); // création d'un fichier vide
$dest=fopen("dest.pdf" ,"wb"); // Ouverture du fichier avec le mode écriture;
//$fp=fwrite($dest, $contenu); // tentative d'ecriture dans ce fichier... bof.

Bref, je patauge, je fini même par me demander si c'est possible, ce bazar...

Je reste ouvert à vos lumières :P

par avance merci

Lien vers le commentaire
Partager sur d’autres sites

Hello,

si le but est d'enregistrer sur ton serveur, ça donnerait plutôt :

copy( 'http://www.autresite.com/sfichier.pdf', 'chemin_de_stockage_sur_ton_serveur/bidule.pdf' );

Mais à condition que l'url fopen soit activé (à vérifier via la commande phpinfo() ).

Modifié par Kioob
Lien vers le commentaire
Partager sur d’autres sites

Et si url_fopen est à false, il y a un moyen de contourner ?

Et non, c'est d'ailleurs le but lorsqu'on le met à "false" :P

Lien vers le commentaire
Partager sur d’autres sites

Comme le dit Dan, c'est justement le but de la manuvre.

Il y a éventuellement moyen de contourner ça, mais pas de manière simple (curl, sockets, exec+wget, etc). Le plus simple reste certainement de modifier la configuration.

Lien vers le commentaire
Partager sur d’autres sites

Ha ? Avec Curl, j'ai déja récupéré du HTML, mais je pensais pas qu'on pouvait récupérer n'importe quoi (pdf, .doc...). Ca m'interesse ça : En pratique, je n'ai pas la main sur le serveur distant, donc je ne connais pas par avance la config.

Mais curl permet de mettre le contenu de la page dans une variable. Pas de copier un fichier sur mon serveur, à ma connaissance. Je vais me retrouver avec le même problème qu'au début de mon post, à savoir une bouillie infame, pas un pdf.

Je precise, mon but n'est en aucun cas du piratage ! C'est en accord avec les sites distants, mais je n'ai pas de controle de leur configs.

Dernier point, Kioob, ton bout de script marche nickel, merci. Mais c'est vrai, seulement sur les configs serveur 'ouvertes'....

Lien vers le commentaire
Partager sur d’autres sites

Ce qu'il veut dire c'est qu'une fois que tu as le contenu du fichier dans la variable $bidule , il te suffit de l'enregistrer dans un fichier. Le résultat sera le même :

file_put_contents( $nomDuFichierLocal, $tonContenu );

Et la doc : http://fr.php.net/file_put_contents

Mais que ce soit via CURL, via un "copy" direct, ou via un exec+wget, rien ne t'assure que ces fonctions seront disponibles d'un serveur à l'autre. Donc à moins que tu veuilles jouer avec les sockets (un client basic en HTTP 1.0 n'est pas si compliqué après tout), le mieux reste à mon avis de te reposer sur copy/url_fopen ; et donc de l'imposer comme prérequis pour ton application.

Lien vers le commentaire
Partager sur d’autres sites

Bjr,

Merci de toutes ces infos, j'avance bien, du coup :

- Curl pour récupérer les fichiers, et les mettre en variable.

- file_put_content pour créer le fichier (je connaissais pas cette fonction, elle n'existe pas en php4 manifestement.)

Pour le curl, je pense que je vais m'en sortir, par contre, pour file_put_content, ça ne marche pas pour moi :

J'ai toujours ma bouillie à l'ecran ;), le fichier pdf (test.pdf) est bien crée, avec du contenu dedans, mais... acrobat ne sait pas l'ouvrir, il considère le fichier comme endommagé. Par ailleurs, par exemple, mon fichier pdf initial fait 72 Ko et le test.pdf résultant n'en fait que 10, donc il y a un pb quelque part...

$test=fopen("http://www.site.com/monpdf.pdf","r");
$taille=readfile("http://www.site.com/monpdf.pdf");
$contenu=fread($test, $taille);
$nomDuFichierLocal='CD15/test.pdf';
file_put_contents( $nomDuFichierLocal, $contenu );

Je precise, j'ai bien un serveur en php5, j'ai testé en php4, et la fonction n'est pas reconnue....

Lien vers le commentaire
Partager sur d’autres sites

Hello,

disons que tu mélanges un peu beaucoup de choses.

*) si tu veux utiliser fopen(URL), tu en reviens au problème avec "allow_url_fopen". Autant utiliser directement copy, qui en plus consommera beaucoup moins de mémoire.

*) readfile() ça envoit le contenu d'un fichier à l'écran... que vient elle faire ici ?

*) si tu veux charger tout le contenu d'un fichier dans une variable, utilises plutôt file_get_contents().

*) encore une fois, faire un file_put_contents( file_get_contents( ) ) ne rime à rien et peut consommer beaucoup de mémoire, copy() est plus adaptée à ça. file_put_contents() je ne te l'ai conseillée que dans le cas où tu récupèrerais le contenu via curl dans une variable.

*) qui utilise encore PHP 4 ? :P

Modifié par Kioob
Lien vers le commentaire
Partager sur d’autres sites

Merci de vos encouragements, :P

Ma doc, c'est la Bible php, et ils utilisent readfile pour donner la taille du fichier.... :( mais je pense que oui, j'ai pataugé, là....

En fait, je suis pas du tout développeur, simplement, coder, ça me detend, mais j'ai aucune base technique. Et helas, la construction objet du php5 m'est totalement obscure...

Heureusement, ya plein de gars sympas sur ce forum pour me confirmer que je suis une moule, ... et me remettre dans le droit chemin :P

Bon, je reteste tout ça...

Lien vers le commentaire
Partager sur d’autres sites

Bon, je suis définitivement un génie :whistling:

$contenu = file_get_contents('http://www.monsite.com/monpdf.pdf');
$nomDuFichierLocal='CD15/test.pdf';
file_put_contents( $nomDuFichierLocal, $contenu );

ça marche du tonnerre de Dieu !

J'ai plus qu'a greffer mon bout de Curl, et ça va rouler quelle que soit la config serveur.

Merci à tous pour votre coup de main.

Lien vers le commentaire
Partager sur d’autres sites

hu hu :)

J'insiste mais :

copy( 'http://www.monsite.com/monpdf.pdf', 'CD15/test.pdf' );

Ca fait exactement la même chose, en une seule ligne et en consommant moins de mémoire : file_get_contents charge tout le contenu du fichier en mémoire. Avec un PDF de 5 ou 10Mo (s'il contient des images), les effets peuvent être assez génant.

file_put_contents(), n'est à utiliser qu'avec curl dans ton cas.

Lien vers le commentaire
Partager sur d’autres sites

Vi, je suis d'accord, mais comme je dois faire un truc qui passera partout, ça sera forcement avec Curl.

Mais tu as raison, avec un serveur distant url_fopen à on, ta solution est la plus simple.

Lien vers le commentaire
Partager sur d’autres sites

Là je ne te suis plus du tout :

- curl est très loin d'être présent chez tous les hébergeurs

- c'était quoi ton exemple avec file_get_contents + file_put_contents alors ?

Lien vers le commentaire
Partager sur d’autres sites

Curl, pour l'utiliser, il suffit qu'il soit sur... MON serveur :), pas besoin qu'il soit sur le serveur distant (cible). Et grace à ce bon Dan, si je veux Curl, bah je l'ai :).

file_get_contents, c'etait juste pour récuperer le contenu du pdf, pour les tests. Après, comme je disais, si le serveur distant accepte url_fopen, ta methode 'copy...' est effectivement plus rapide.

Et mon exemple avec curl, ça sera donc :

/*
Script Curl à développer pour recupérer le pdf et le mettre dans une variable, disons $contenu.
*/
$nomDuFichierLocal='CD15/test.pdf';
file_put_contents( $nomDuFichierLocal, $contenu );

Lien vers le commentaire
Partager sur d’autres sites

Ha ???

Je suis définitivement une buse, alors ?? Je pensais que c'etait le serveur distant qui autorisait ou pas le Fopen de ses fichiers...

C'est bizarre, mon serveur est à on, donc copy... devrait marcher sur TOUS les sites distants, alors ?

Et c'est pas le cas : J'ai fait le test sur un serveur à Off, et j'ai bien un message dans le fichier récupéré, qui me dit 'vous n'avez pas accès....". pourtant, le pdf testé etait téléchargeable sans restriction, via une simple url classique affichée sur le site.

On repart à zero, alors ?

Je recapitule :

- Sur mon serveur, je peux avoir la config que je veux, sans restriction (hein Dan, hein ??). Aujourd'hui, je suis à On pour allow_url_fopen.

- Je veux pouvoir récuperer les pdf sur tous les serveurs, sur des sites pour lesquel l'accès aux pdf n'est pas protégé (ces pdf sont en libre accès, il n'y a aucun piratage, tout se passe très 'proprement' vis à vis du propriétaire distant).

Quid :(

Lien vers le commentaire
Partager sur d’autres sites

Après il est aussi possible que le serveur distant en question ait mis un "filtre anti aspirateur" très mal fichu qui bloque les scripts PHP...

Peux tu nous donner une des adresses en question pour vérifier ?

Sinon, tu peux toujours jouer avec les options de contexte, mais je sens que ça va devenir compliqué :D

Lien vers le commentaire
Partager sur d’autres sites

JE SUIS LE ROI DES C.... !!!!!

Le test que j'ai fait sur un serveur à Off appellait un fichier php, que j'avais justement protégé contre ce type d'appel !!!

Rhaaa, je me hais....

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...