Newsgroup: it.comp.www.asp
Titolo: Aggiungere foto nel guestbook

Ciao a tutti
vorrei dare la possibilità nel mio guestbook di poter inserire una foto a
messaggio.
Io ho pensato di: far uplodare l'immagine nella cartella Public (uso Aruba)
e in qualche modo, registrare in un record del database tutto il percorso
con il relativo nome del file.
La domanda è questa: prima di tutto, questa idea è giusta? Cioè, faccio bene
a pensare di registrare nel DB solo il percorso del file e non direttamente
la foto? (so che non conviene memorizzare immagini in un DB).
..2  Nel caso sia corretto, come faccio a fare ciò?
Confido in una Vostra mano

"Giovanna" <giov...@giovanna.giovanna> wrote in message
news:B6Js9.15748$TD1.7...@news2.tin.it...

Ci sono una sfilza di SE e di MA.
Innanzitutto assicurati di avere i diritti di scrittura su quella cartella.
Il codice che vedi pubblicato qui prende una intera request, cerca il file e
lo salva sotto forma
di file binario.
Il tutto si basa sul tipo di input chiamato FILE, per cui se il browser non
lo riconosce comparira' un campo testo, altrimenti appariranno un campo
testo e un pulsante chiamato "browse" o "sfoglia".
<!-- #BEGIN CODE -->
<%
Option explicit
Response.Buffer = true
'questa funzione accetta la proprieta' request.binaryread come dato in
ingresso.
'in sostanza va a leggere la request come dato binario e non come collection
di variant.
Function BuildUpload(RequestBin)
     'setto i "confini" del dato binario
    dim PosBeg, boundary
    dim PosEnd, boundaryPos
     PosBeg = 1
    'seleziono il dato binario dall'inizio fino al primo punto in cui trovo
chr(13)
     PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
     boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
     boundaryPos = InstrB(1,RequestBin,boundary)
     'Piglo tutto cio' che sta tra posBeg e boundaryPos
     Do until (boundaryPos=InstrB(RequestBin,boundary &
getByteString("--")))
          'mi creo un dictionary per le variabili
          Dim UploadControl
          Set UploadControl = CreateObject("Scripting.Dictionary")
          'Get an object name
          Pos =
InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
          Pos = InstrB(Pos,RequestBin,getByteString("name="))
          PosBeg = Pos+6
          PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
          Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
          PosFile =
InstrB(BoundaryPos,RequestBin,getByteString("filename="))
          PosBound = InstrB(PosEnd,RequestBin,boundary)
          'Controllo che i dati corrispondano ad un oggetto di tipo file
          If PosFile<>0 AND (PosFile<PosBound) Then
               'Verifico il nome del file, il tipo di contenuto e il
contenuto
               PosBeg = PosFile + 10
               PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
               FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
               'infilo il nome nel dictionary
               UploadControl.Add "FileName", FileName
               Pos =
InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
               PosBeg = Pos+14
               PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
               'metto il content type nel dictionary
               ContentType =
getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
               UploadControl.Add "ContentType",ContentType
               'ora leggo il contenuto
               PosBeg = PosEnd+4
               PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
               Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
               Else
               Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
               PosBeg = Pos+4
               PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
               Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
          End If
            'adesso metto Value nel dictionary
          UploadControl.Add "Value" , Value
            ' e infilo il dictionary in un dictionary ESTERNO ALLA FUNZIONE
          UploadRequest.Add name, UploadControl
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
    'il giro viene eseguito finche' ci sono file nel form, infatti questo
sistema puo' gestire anche l'upload multiplo.
     Loop
End Function
'Funzioni accessorie per leggere nel "binario"
Function getByteString(StringStr)
     For i = 1 to Len(StringStr)
          char = Mid(StringStr,i,1)
          getByteString = getByteString & chrB(AscB(char))
     Next
End Function
Function getString(StringBin)
     getString =""
     For intCount = 1 to LenB(StringBin)
          getString = getString & chr(AscB(MidB(StringBin,intCount,1)))
     Next
End Function
'parte che gestisce l'arrivo della request e la chiamata alle funzioni di
cui sopra, nonche' il salvataggio del file
If request("Action")="1" then
     byteCount = Request.TotalBytes
     response.write "!" & bytecount 'questo serve a verificare che nella
response ci sia qualcosa
     RequestBin = Request.BinaryRead(byteCount)
    'NB: usare Binary read implica l'impossibilita' di usare .querystring e
..form
    'questo oggetto verra' usato dalla funzione BuildUpload
     Set UploadRequest = CreateObject("Scripting.Dictionary")
     BuildUpload(RequestBin)
    'qui va a leggere il dictionary riempito da BuildUpload
     If UploadRequest.Item("blob").Item("Value") <> "" Then
        'qui costruisco nome e percorso del file
          contentType = UploadRequest.Item("blob").Item("ContentType")
          filepathname = UploadRequest.Item("blob").Item("FileName")
          filename =
Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
          FolderName = UploadRequest.Item("where").Item("Value")
          Path = Mid(Request.ServerVariables("PATH_TRANSLATED"), 1,
Len(Request.ServerVariables("PATH_TRANSLATED")) - Len
(Request.ServerVariables("PATH_INFO"))) & ""
          ToFolder = Path & "" & FolderName
          value = UploadRequest.Item("blob").Item("Value")
          filename = cstrMiaCartellaPubblica & "" & filename
          Set MyFileObject =
Server.CreateObject("Scripting.FileSystemObject")
          Set objFile = MyFileObject.CreateTextFile(filename)
          For i = 1 to LenB(value)
               objFile.Write chr(AscB(MidB(value,i,1)))
          Next
          objFile.Close
          Set objFile = Nothing
          Set MyFileObject = Nothing
     End If
     Set UploadRequest = Nothing
End If
%>
'qui disegno il form
<form METHOD="POST" ENCTYPE="multipart/form-data"
action="Upload_test.asp?Action=1" name="form1" id="form1">
<table cellspacing="0" cellpadding="3" width="100%" border="0">
     <tr>
          <td>
               <b>Select a file to upload: </b>
          </td>
          <td>
               <input TYPE="file" NAME="blob" value>
               <input TYPE="HIDDEN" NAME="where" value="Images">
          </td>
     <tr>
     <tr>
          <td colspan="2" align="center">
               <input TYPE="submit" NAME="Upload" Value="Click to Upload">
          </td>
     </tr>
</table>
</form>
<!-- #END CODE-->
Ti suggerisco di studiare bene cosa fa ogni singola parte di codice, di non
eseguire il copia e incolla immediato, e sul nome del file di effettuare un
controllo sugli ultimi 4 caratteri  scartando tutto cio' che non corrisponde
ad un tipo di immagine visibile via web (.gif, .jpg, .png) e che non superi
una certa dimensione (la lunghezza del file), in modo da evitare che il
solito LAMER pubblichi una foto a da qualche mega si da rendere
inutilizzabile la pagina e saturarti lo spazio web.
Ora ti lascio all'inevitabile mal di testa che ti aspetta (evil grin).
Andrea Venturo

se vai su 
vademecum.aruba.it
 trovi i file per l'upload, in modo che , una
volta scompattati e mandati nella cartella public, l'upload viene eseguito
tranquillamente, non ti rimane che aggiungere un paio di righe tipo:
response.redirect("aggiungi_immagine.asp?nome="&filename")
in modo da spedire alla pagina .asp il nome della foto, poi scegli come
gestire l'inserimento.
Io di solito mando anche l'id del post, in modo da effettuare solo un update
della tabella dei post , del record relativo all'id !
il gioco č fatto !
Alternativa, rinomini l'immagine con nome = ID del post , e poi farai nella
pagina della visualizzazione solo un controllo sull'esistenza della foto !
(E non tocchi DB) !
--
+ --------------------------------------- +
           .:.   FrOiD  .:.
**********************************
L'Uomo che non coltiva l'abitudine
di pensare perde il piů grande
piacere della vita.
                        T.A.Edison
**********************************
ICQ: 25876612