Code pour forcer un téléchargement de pdf

Répondre
frob
le 28/03/2008 à 20:16
frob
Bonjour, le message est en partie pour LA GLOBULE ou autres personnes qui comprends cette théorie. J'ai trouvé plusieurs codes sur le net pour faire cette opération mais comme à chaque occasion il faut sortir notre esprit critique et en choisir un qui semble complet, concis et structuré selon de bons critères de programmations.

Bref j'ai choisi celui de LA GLOBULE (bravo :-) ) mais je n'arrive pas à saisir la théorie à partir de la ligne #45 La constante DL_BUFFER , la boucle et l'echo.

Enfin, j'aimerais une recommandation à savoir la manière idéale pour appeler cette fonction (endroit et balises)

Alors si quelqu'un d'aimable pourrait mettre quelques commentaires au code, j'apprécierais beaucoup.

Un gros merci
Frob

<?php
define ('DL_BUFFER', 16384);

function download ($blob, $filename) {
$filename = ereg_replace('[\\/:\*\?"<>\|;]', '_', str_replace('&#32;', ' ', $filename));

$isIE = $isIE6 = false;

if (isset($_SERVER["HTTP_USER_AGENT"])) {
$HTTP_USER_AGENT = $_SERVER["HTTP_USER_AGENT"];

if (strstr($HTTP_USER_AGENT, 'compatible; MSIE ') !== false && strstr($HTTP_USER_AGENT, 'Opera') === false) {
$isIE = 1;
}
if (strstr($HTTP_USER_AGENT, 'compatible; MSIE 6') !== false && strstr($HTTP_USER_AGENT, 'Opera') === false) {
$isIE6 = 1;
}
}

header('Pragma: ');
header('Cache-Control: cache');

if ($isIE) {
$filename = rawurlencode($filename);
header ("Pragma: public");
header ("Cache-Control: no-store, max-age=0, no-cache, must-revalidate");
header ("Cache-Control: post-check=0, pre-check=0", false);
header ("Cache-Control: private");
header ("Content-Disposition: inline; filename=$filename");
}

header ("Content-Type: application/octet-stream; name=\"$filename\"");
header ("Content-Disposition: attachment; filename=\"$filename\"");

if ($isIE && !$isIE6) {
header ("Content-Type: application/download; name=\"$filename\"");
}
else {
header ("Content-Type: application/octet-stream; name=\"$filename\"");
}

$size = strlen($blob);

$nb = ($size/DL_BUFFER);
$reste = ($size%DL_BUFFER);
for ($a=0; $a<$nb; $a++) {
echo substr($blob, $a*DL_BUFFER, DL_BUFFER);
flush();
}

echo substr($blob, -$reste);
flush();
}
?>


- $filename : le nom que tu veux donner au fichier
- $blob : le contenu binaire du fichier (récupérable avec un file_get_contents)
LA GLOBULE
le 28/03/2008 à 22:40
LA GLOBULE
Je t'avouerais que je l'ai su, mais que je ne m'en souviens plus trop.

J'avais fais ça à mon ancien taff, surement parce que un echo normal ne passait pas pour certains navigateurs ou alors c'était à cause d'une configuration louche du serveur web.

Pour l'utiliser, c'est simple, tu fais un .php avec dedans : download($binary_data, 'toto.pdf');
Et juste ca, pas de HTML avant ni après, sauf bien sur du PHP pour récupérer le $binary_data (en gros, ne provoque pas la génération de header HTML quoi).

$binary_data représente les données binaire du PDF (après, tout dépend de où est stocké ton PDF, si il est sur le filesystem, un simple file_get_contents peut te retourner ces données binaire, ou si c'est en base dans un champ blob, un select SQL te donnera ces données).
frob
le 29/03/2008 à 02:54
frob
Bonsoir,
merci pour cette réponse, j'apprécie. Merci pour le echo, j'aimerais cependant savoir le DL_BUFFER car aucun autre code que j'ai trouvé l'utilise et je ne comprends pas vraiment son travail.

Excuses-moi de me répéter mais la boucle elle? Elle te rappelle quelque chose?

Sur ce je te souhaite un bon weekend et j'espère avoir de tes nouvelles bientôt...tu m'as gâté avec ce dernier...

Merci
Frob
LA GLOBULE
le 29/03/2008 à 03:01
LA GLOBULE
C'est le DL_BUFFER c'est une constante arbitraire, et la boucle, ben elle balance les data au fur et à mesure, elle permet de pas tout echo d'un coup.

Si ca te gene, tu vires cette boucle et tu fais un simple echo.
frob
le 29/03/2008 à 03:59
frob
salut...

lol, j'imagine que je pose mal mes questions et je dois donner l'impression de débuter mais je un petit bagage (même si j'en ai bcp à apprendre encore....je dirais même énormément!)

Je sais ce que la boucle fait (des echos) mais l'affichage sers juste pour des tests?

Et je sais que c'est une constante arbitraire mais choisi comment et pourquoi...

En espérant pas vous tanné.

En passant félicitation pour ton travail...beau site, simple et agréable...

Frob
LA GLOBULE
le 29/03/2008 à 15:30
LA GLOBULE
Quel affichage ? Les echo ? Les echo servent à afficher le contenu binaire du document PDF. Et comme un header approprié est balancé juste avant, ben le navigateur télécharge le document PDF.
Ils sont nécéssaires, et ne sont pas la pour des tests : si tu "n'affiches" pas le contenu du PDF, le PDF ne peut pas être téléchargé.
Ca marche comme pour une page HTML ou un document gif.

Quand tu vas sur une URL, par exemple http://www.site.com/toto.gif, le server web balance un header en disant "coucou, le document qui va suivre, c'est une image gif", et ensuite, il écrit (d'où les echo) le contenu binaire du gif.

En gros, ce qu'il te manque, c'est quelques connaissances du protocole HTTP. Regarde wikipedia (les notions de bases suffisent, pas besoin de rentrer dans les RFC).

Et la constante, je ne sais plus pourquoi je l'avais défini à ce nombre d'octets.
frob
le 29/03/2008 à 15:49
frob
Bon bon, oui j'avais pris le temps de lire avant sur les entêtes http1.0.(Mais par respect je vais aller voir WIKI quand même) Mais je n'avais pas vu cette notion. En plus, j'ai cherché à trouver d'autres façon pour exécuter cette tâche (j'en ai environ une dizaine) et tu es le seul à balancer de cette façon (en général c'est un readfile(). Mais tu es aussi le seul qui prends le temps de vérifier le navigateur....ce pourquoi j'aimais ta façon. En conclusion, j'ai jamais vu une démarche fait de façon aussi différente d'un à l'autres et surtout fait avec des à peu près. Je comprends maintenant pourquoi lorsque je télécharge par mirroir chez d'autres site, qu'à l'ouverture il m'indique 'fichier défectueux ou impossible à ouvrir!'

Un gros merci
Frob
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours