Newsgroup: it.comp.www.php
Titolo: Forzare il download di un file PDF

Salve a tutti.
Ho dei problemi con uno script che forza il download di un file pdf (il
browser IE lo apre automaticamente, ma io voglio che ciò non accada).
In realtà il file viene scaricato, ma poi non riesco ad aprirlo (l'acrobat
reader mi dà un errore di apertura). Inoltre, questo errore non ricorre per
tutti i file pdf (ho provato con vari file di dimensioni diverse, per alcuni
funziona, per altri no, indipendentemente dalla loro dimensione).
Lo script è il seguente:
-------------------downpdf.php-------------------------------
<?php
    header("Content-Description: File Transfer");
    header("Content-Type: application/pdf");
    header('Content-Length: ' . filesize($file));
    header("Content-Disposition: attachment; filename=$file");
    readfile($file);
?>
dove $file proviene dal link "downpdf.php?file=nomefile.pdf"
Qualcuno sa dirmi da cosa dipende l'errore? E' un problema di MIME type, di
codifica, o cosa?
Vi ringrazio tanto....
Ciao
Banshee

Banshee wrote:

Prova ad inserire
$file = $_GET['file'];
in cima allo script
-- 
Spoken: How much is that gorilla in the window?
Take our advice, At any price, A gorilla like Magilla is mighty nice.
Gorilla, Magilla Gorilla for sale

 ha scritto nel messaggio
news:cjehkd$608$1...@lacerta.tiscalinet.it...

potresti provare con fpassthru() al posto di readfile() aprendo il file in
modalita' binaria.
prova (non consigliato) anche cambiando il mime type in
application/octet-stream (attenzione alla sicurezza!!!! -- metti delle
condizioni che il file sia un .pdf)

Niente da fare.... non funziona nè cambiando il MIME type, nè usando
fpassthru() , nè con $_GET[].... non capisco proprio quale sia il problema
:(
Grazie comunque per l'aiuto... Altre idee?
"L'incompetente" <l_incom...@strikes.again> ha scritto nel messaggio
news:cjeifp$957$1...@lacerta.tiscalinet.it...


Grazie comunque per l'aiuto... Altre idee?
Prova con application/download, octet-stream mi pare che non funzioni
bene con IE...e come ti hanno già fatto notare...occhio alla sicurezza
;-)
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Project Admin di "PHP Reservation - Online booking system" - 
http://phpreservation.sourceforge.net
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 Prova con application/download, octet-stream mi pare >che on funzioni


Ho fatto un compare tra i file (tra quello che si trova sul server e quello
che ho scaricato, tramite lo script, dal server).
I file differiscono all'inizio e alla fine:
-- All'inizio dovrebbe essere qualcosa tipo "%PDF-1.2%"[...], invece è
"ï»¿PDF-1.2%"[...]
-- Alla fine  dovrebbe essere qualcosa tipo [...]"%%EOF"  invece è
[...]"%%E"
Forse questo vuol dire che c'è un problema di codifica?
Grazie ancora e scusate se sto insistendo, ma questa cosa mi fa impazzire!!!
"Banshee" ha scritto



:Provate a guardare gli ingredienti del famoso Labello che si usa per
:le labbra screpolate: Butirrospermum Parkii (sperma di maiale).


Ci avevo già provato ed anche questa è andata buca!!!


  
Veramente il modo standard di forzare il download č l'header
content-disposition (RFC2183). Cusŕ..
header("Content-Disposition: attachment; filename=nomefile.pdf");
header("Content-Type: application/pdf");
Ci sono ovviamente problemi anche qui con IE, ma solo in certi casi e solo
con la 5.5 (basta cercare su 
support.microsoft.com
)

header("Content-Type: application/pdf");
Ummmm. Allora mi sa che ci avevo provato; poi si vede c'ero riuscito per
qualche altro motivo; e ho lasciato gli header sballati. Come temevo, si
trattava di macumbe. Poi, avendo funzionato, non ho indagato piu'.
Mi sa che anche questa tua andrebbe messa nelle FAQ, dato che ogni tanto
risalta fuori (e quasi ogni sito ha una soluzione diversa - che funziona
in certi casi si', e in altri no).
Leonardo che intanto ne approfitta
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

riesco ad aprirlo.
Avevo capito male io: pensavo che il non riuscire a scaricarlo avesse un
altro meccanismo.
Stando cosi' le cose non saprei che suggerirti; se alcuni file li prende
ed altri no, bisognerebbe capire perche'... cioe' dove sta la differenza
critica.
Una volta trovato un PDF che si scarica sempre bene e uno sempre male si
puo' provare a copiare il secondo sul primo. Se il primo scarica bene e'
una questione di nome (been there, done that: .PDF vs. .pdf, spazi, vari
caratteri in alfabeti esotici...).
Altrimenti dipende dal contenuto: e li' e' l'Apocalisse: magari, uno dei
due file ha le terminazioni \n e l'altro \r\n o \r, e questo causa guai:
anche se a me non succede, io ho file sia con \n che con \r\n.
Oppure e' la versione di PDF (e' scritta nella prima riga) che magari si
combina male col tuo lettore (ecco, altra prova: succede con altri PC?).
Oppure manca il ^D in fondo (ho provato a toglierlo, e con Acrobat 6 non
cambia nulla; pero'...).
Un test rapido si puo' fare confrontando il PDF originale sul sito - che
immagino fosse valido, altrimenti be' - con quello scaricato: vedere che
differenze son comparse puo' dare indizi (es., tutti i \n sono diventati
\r\n o dei caratteri sono stati cambiati in sequenze inattese).
Prova anche a mettere il PDF direttamente come link, e a vedere se cosi'
lo scarica giusto; o a cambiargli nome in .BIN sul server, e di nuovo in
.PDF sul client. Una variazione legata a queste due potrebbe indicare un
comportamento anomalo del server, legato forse al mime-type.
Leonardo


 comportamento anomalo del server, legato forse al mime-type.
Anche io sto per giungere a questa conclusione... Ho avuto già un problema
di MIME-type con aruba (non riconosceva i file .log come file di testo) e
non l'ho mai risolto, grazie alla loro incompetenza....
Vabbè, vorrà dire che mi arrenderò e metterò il file zippato.... :(
Grazie mille


E come ho detto prima le differenze ci sono! A inizio e fine file.
Si', _ora_ ho letto.
Curiosita': stai mica usando lo zlib compress output in php.ini, o qualche
compressore analogo?


 compressore analogo?
Non ne ho idea, visto che sto facendo le prove direttamente sul server
(Aruba)... Cmq non preoccuparti, ormai ho deciso che lascio stare, perchč
dopotutto non č poi cosě importante, anche perchč questo č il mio primo
sito....
č solo che quando succedono queste cose incredibili mi arrabbio cosě
tanto....
Pazienza, grazie mille per l'aiuto comunque.
Ciao
Banshee


(Aruba)... 
Controlla con phpinfo(), e casomai puoi disattivare lo zlib compress per
quel file...


Nella parte generale ho trovato questo campo:
Registered PHP Streams:  php, http, ftp, compress.bzip2, compress.zlib
e poi la parte su zlib è questa:
---------------------------zlib------------------------------------
ZLib Support                  enabled
Compiled Version           1.1.4
Linked Version               1.1.4
Directive                                  Local Value        Master Value
zlib.output_compression                Off                        Off
zlib.output_compression_level        -1                         -1
zlib.output_handler                     no value                 no value
------------------------------------------------------------------
Questo vuol dire che lo zlib compress è disattivato, vero?
Grazie ancora.


Questo vuol dire che lo zlib compress è disattivato, vero?
Yep. Mi dichiaro vinto e battuto: non ho piu' la minima idea di cosa
potrebbe essere, ho finito gli specchi su cui arrampicarmi :-(
Oltre al confrontare bit per bit i due php.ini, sperando di ricevere
un'ispirazione felice, non saprei davvero piu' che pesci pigliare.
Leonardo basito


 Forse questo vuol dire che c'è un problema di codifica?
Mi sembra evidente  che vengono aggiunti due caratteri inizio file,
corrotto il terzo, eliminati gli ultimi due.. Prova a sostituire il
filename=$file degli header con qualcosa di fisso tipo filename=gino.pdf e
ad eliminare l'header content-length..
fe...@delenda.net
-- 
You're in a maze of twisty little passages, all alike. There is a dusty
laptop here with a weak wireless connection. There are dull, lifeless
gnomes strolling about. What do you do ?
[cfr. 
http://www.google.com/googleblog/2004/09/pencils-down-people.html
]


Grande!!!!!!!!!!!!!! Cosě funziona!!!! Ho fatto cosě:
-------------------downpdf.php-------------------------------
<?php
    if ($var==1)
    {
       $file = "prova.pdf";
    }
    if ($var==2)
    {
       $file = "prova2.pdf";
    }
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Type: application/pdf");
    header("Content-Transfer-Encoding: binary");
    header("Content-Disposition: attachment; filename=$file");
    readfile($file);
   exit();
?>
dove $var proviene dal link "downpdf.php?var=[numero]", con [numero] che
vale 1 o 2 a seconda che si deve scaricare il file prova.pdf o prova2.pdf.
Ma, allora, sai per caso cos'č che non lo faceva funzionare?
Ti ringrazio infinitamente...
Banshee