Newsgroup: it.comp.lang.perl
Titolo: download file con perl e MySQL (quale HTTP header?)

Buongiorno a tutti.
Allora, su MySQL ho creato una tabella nella quale, oltre a vari dati
riguardanti un potenziale cliente di una ditta, c'e' anche un campo
BLOB per conservare un allegato di vario genere (.doc., .jpg etc)
e 2 campi per conservare il suo nome e il tipo che il browser indica
con il "Content/Type"
Questi dati vengono immessi in una form via browser, inviati al server
e memorizzati con degli script perl che utilizzano DBI.
L'upload va a buon fine come pure la memorizzazione degli allegati grazie
alla preventiva
$sql=$dbh->quote($allegato);
prima di fare l'UPDATE.
OK arrivo al problema! :)
Allora, per downloadare l'allegato c'e' un link ad uno script perl
(a cui passo la chiave primaria del record che contiene l'allegato)
che interroga il database, mette l'allegato in una variabile e fa: 
 
   print "Content-Type: $TipoAllegato\r\n\r\n";
 
   print "$Allegato"; 
 
che dice al browser che sta arrivando il file del tipo giusto. 
 
PROBLEMA: la finestra del "save" che mi appare mette come nome del file il
          nome dello script e non il nome dell'allegato! 
 
Soluzione 1) 
con il codice
 
     $updir = "../updir"; 
 
     open(FILE, "> $updir/$NomeAllegato"); 
     print FILE "$Allegato"; 
     close(FILE); 
 
     print "Location:$updir/$NomeAllegato\n\n"; 
 
metto l'allegato dal DB in un file e dico al browser di "saltare" 
al file in questione. 
Stavolta naturalmente nella finestra dello "save" c'e' il nome del file MA
non posso cancellare il file dalla directory visto che lo script non puo'
sapere quando il file e' stato correttamente scaricato per poterlo
quindi cancellare dalla directory temporanea.
Soluzione 2) 
Potrei mettere tutti gli allegati in una directory e nel DB i path e il
nome dell'allegato 
problema: e se 2 persone mettono in 2 record diversi un allegato con lo
stesso nome??? Bhe l'allegato di nome $NomeAllegato verra' scritto
sul file system come chesso' $NomeCliente-$OraCorrente-$NomeAllegato
... in maniera da rendere univoco il nome del file..
OK questa soluz va ma... NON la voglio adottare...
mi spiego: io voglio lasciare gli allegati tutti nel DBMS, visto che
e' il suo mestiere gestire i file, non voglio farlo io (cancellarle
l'allegato, rimetterne un altro etc..) 
Credo quindi che la soluzione (se c'e'!) sia da cercare nelle informazioni
che do' al browser sul file, cioe' a livello di header HTTP.
Ho cercato su 
http://www.w3.org/Protocols/HTTP/Object_Headers.html
e ho provato di tutto ma qualsiasi cosa io scriva dopo
print "Content-Type: $TipoAllegato\r\n\r\n";
lui giustamente me la scrive nell'allegato, mentre "prima" di questo
ha effetto il solo
print "Location:$updir/$NomeAllegato\n\n"; 
CHE FARE???? Sono costretto ad adottare la soluzione 2)?
Oppure c'e' un modo per dire al browser che in realta' quello che sta
ricevendo si chiama in una maniera diversa? Ovvero posso intervenire
tramite perl mandando un header al browser che "bypassi" quello che
manda Apache (che contiene il nome del file)???
Grazie a tutti per avermi letto fin qui!
Ciao.
Andrea Maestrutti

 qualsiasi linguaggio.
Cercando VELOCEMENTE su comp.infosystem.www.authoring.cgi
ho trovato una risposta esattamente a questa domanda.
Sembra che una soluzione sia mandare l'header Content-Disposition:
print "Content-Disposition: $filename\r\n";
e l'altra sia di aggiungere il filename all'URL come PATH_INFO
/cgi-bin/file.cgi/filename.ext
Non garantisco assolutamente sulla correttezza di queste informazioni, dal
momento che non le ho provate personalmente.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

           nome dello script e non il nome dell'allegato! 
E' un problema di HTTP, non di programmazione Perl. Una volta scoperto come
fare (e sicuramente c'e' in qualche FAQ su CGI), lo fai nello stesso modo in
qualsiasi linguaggio.
Maurizio


 /cgi-bin/file.cgi/filename.ext
Questa si!!!
e' bastato 
print "<A HREF=\"
script.pl/$NomeAllegato?ID=$ID\
">Scarica</A>";
e ho risolto!!!
Grazie per la dritta e ... scusate se non ho letto prima le faq
di quel newsgroup ;) (e si' che ho cercato per un bel po' eh!)
Sorry!
Ancora grazie e ciao!
Andrea Maestrutti

 print "<A HREF=\"
script.pl/$NomeAllegato?ID=$ID\
">Scarica</A>";
Il sottile piacere degli escape. :)
 print qq{A HREF="
script.pl/$NomeAllegato?ID=$ID
">Scarica</A>};
 
Se si scrive HTML e' fondamentale ridurre le rotture!


  print qq{A HREF="
script.pl/$NomeAllegato?ID=$ID
">Scarica</A>};
 
   print qq{<A HREF="
script.pl/$NomeAllegato?ID=$ID
">Scarica</A>};
Piccolissima correzione.
M.