Newsgroup: it.lavoro.professioni.webmaster
Titolo: AIUTATEMI

Come faccio a inserire un form che permetta anche l' invio di file allegati
?
aiutatemi, io ci ho provato ma non funziona....se volete vederlo è a questo
indirizzo:
http://utenti.tripod.it/linus68/amici_form.htm
Vi ringrazio anticipatamente x la collaborazione.
                         ________________________
               o O  / 
http://utenti.tripod.it/linus68/
       \
        `\|||/         | E-Mail: 
lino...@lycosmail.com
 |
       (o o)         \________________________/
ooO_(_)_Ooo________________________________
_____|_____|_____|_____|_____|_____|_____|____
__|_____|_____|_____|_____|_____|_____|_____|_
_____|_____|_____|_____|_____|_____|_____|____


<INPUT TYPE="file" size=40  NAME="file1">
<TEXTAREA NAME="COMMENTS1" ROWS="4" COLS="33" WRAP=PHYSICAL></TEXTAREA>
<INPUT NAME="nominativo"  SIZE=33">
INPUT TYPE="Submit" VALUE="  Esegui  ">&nbsp;<INPUT TYPE="Reset"
VALUE="Cancella">
</FORM>
</BODY>
</HTML>
Puoi reindirizzare i dati di una form e il file selezionato con input
type=file al programma cgi
che può essere un semplice programmino in C che legge i dati dallo stdin e
scrive su un file temporaneo, dopodichè, finita l'operazione apri in lettura
il file temporaneo, ti prendi quello che ti serve e scrivi in modalità
append
nel file indicato nel richiamo al cgi che sopra ho indicato filedioutput.
Il programma in C deve essere di questo tipo:
setta l'apertura dei file in binario con, (altrimenti se ti arrivano file in
binario, leggendo da stdin perdi dei caratteri, sabato e domenica sono
rimasto in ufficio fino alle 2 di notte prima di capire perchè non ricevevo
i file completi):
setmode(fileno(stdin), O_BINARY));
dopodichè leggi dalla variabile d'ambiente la dimensione dei dati che ti sta
arrivando via posta
dim=atol(getenv("CONTENT_LENGTH"));
ricava il nome del file di output
strcpy(nome_file,(getenv(QUERY_STRING)); // il nome indicato sopra come
filedioutput
//  cgi?filedioutput
leggi da stdin dim caratteri
totale_letti=0;
while(totale<dim)
{
   Bytes_ricevuti=read(stdin->fd,tmp,4096));  // tmp è int tmp[4097];
   if(Bytes_ricevuti==0)
   {
     totale=dim + 100; // così se ci sono problemi ti assicuri l'uscita dal
ciclo
   }
   totale=totale+Bytes_ricevuti;
   fwrite(tmp,(int)Bytes_ricevuti,1,out));   // FILE *out   out=fopen
"nomefiletemporaneo","w");
}
In breve: devi scrivere su un file temporaneo perchè i dati che ricevi sono
strutturati a pacchetti
di questo tipo:
-----------------------------7cf8cc94c
Content-Disposition: form-data; name="file1";
filename="C:\WINDOWS\Desktop\foto\scrollbox.gif"
Content-Type: image/gif
GIF89a    ³     ÿk ÿO9ÿ"Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù      ,     
    S È ª 3K+º - |ä?mä ª$6vk { ,ßCWã|°ó7ß  ü WBÁ1-\" Ë¦s uV£Ð£0 °n¹Z®<K-'Å"
³ú|¢TÖÂ¶?p i" ;
-----------------------------7cf8cc94c
Content-Disposition: form-data; name="COMMENTS1"
Dati scritti nel textarea
-----------------------------7cf8cc94c
Content-Disposition: form-data; name="nominativo"
dati presi da input1
-----------------------------7cf8cc94c
Content-Disposition: form-data; name="email"
dati presi da input 2
-----------------------------7cf8cc94c--
La prima parte del pacchetto contiene la gif che ho spedito con input
type=file
la seconda parte contiene i dati di una textarea
la terza e la quarta parte contengono dei dati presi da input.
Dunque ti leggi il file, filtri i dati di interesse e li riscrivi su
filedioutput.
N.B. ti faccio scrivere su un file temporaneo e non ti faccio filtrare i
dati durante la lettura perchè
rischi di perdere dei caratteri o di perdere la connessione.
Un ultima cosa e poi concludo, 2 maledizioni al relatore perchè la ricezione
dei dati tramite form
segue le specifiche del RFC 1867 del tutto sperimentali e poco chiare,
persino l'upload file della Microsoft ha dei bachi, per rifare il programma
in modo professionale ho dovuto scrivere più di 500 righe di codice, se un
docente , un relatore o qualsiasi persona non si rende conto della
difficoltà della cosa è un emerito ignorante che non dovrebbe avere nulla a
che fare con l'ambiente universitario.
--
----
Bye
Ro<*¿*>berto