Ho la necessità di salvare delle immagini su database (SQLServer). Il campo del db è di tipo Image.
Dalla mia applicazione l'utente seleziona un file immagine che viene caricato in una ImageBox. Una volta fatta questa operazione il file per me non deve più esistere, infatti vorrei che quando l'utente clicca su SALVA, il programma vada a leggere l'immagine contenuta nell'imagebox, la scomponga e la salvi su db.
Attualmente per gestire il salvataggio su db utilizzo questo sistema:
- Memorizzo il Path del file selezionato dall'utente
- Apro un recordset avente come origine dati la tabella in cui salvare il file
- Setto una variabile di tipo ADODB.Field col campo Image della tabella
- Apro il file in modalità Binary Access Read
- Scompongo il file inserendo ogni pezzetto in un array di tipo Byte
- Assegno l'array al campo ADODB.Field su citato
- Eseguo l'Update sul recordset
Di seguito vi riporto il codice:
codice:
' Carica l'immagine nell'Image box
Private Sub cmdLoadFoto_Click()
cd.ShowOpen
strPath = cd.FileName
' carica l'immagine
imgFoto.Picture = LoadPicture(strPath)
End Sub
' Salva sul db l'immagine contenuta nell'Image box
Private Sub cmdSaveFoto_Click()
Dim strSQL As String
Dim adoRS As New ADODB.Recordset
Dim adoField As ADODB.Field
Dim bytArray() As Byte
strSQL = "SELECT IDFoto, Foto FROM tbImmagini"
adoRS.Open strSQL, adoConn, 1, 3
adoRS.AddNew
Set adoField = adoRS.Fields.Item("Foto")
' Inserisce l'immagine selezionata nel database
bytArray = fnLeggiFile
' Inserisce il file nel nuovo record
adoField = bytArray()
imgFoto.Picture
adoRS.Update
Set adoRS = Nothing
End Sub
' Legge l'immagine inserendola nell'array
Private Function fnLeggiFile() As Byte()
Dim intIndiceFile As Integer, lngDimensioneFile As Long
' Array che contine il file scomposto il byte
Dim bytImmagine() As Byte
Dim i As Long
' Cerca il primo indice di file disponibile nel sistema
intIndiceFile = FreeFile
' Apre il file in lettura
Open strPath For Binary Access Read As intIndiceFile
' Calcola la dimensione del file
lngDimensioneFile = LOF(intIndiceFile)
' Ridimensiona l'array
ReDim bytImmagine(lngDimensioneFile)
' Cicla il file leggendolo un byte per volta
For i = 0 To lngDimensioneFile
Get intIndiceFile, , bytImmagine(i)
Next
' Chiude il file
Close intIndiceFile
' Restituisce l'array
fnLeggiFile = bytImmagine
End Function
Tutto questo funziona alla perfezione, ma non è esattamente ciò che vuole il mio capo.
Ovvero, sarebbe preferibile riuscire a scomporre direttamente l'immagine contenuta nell'imagebox e non andare a suddividere il file fisicamente presente su HD, perchè l'utente potrebbe cancellare il file prima di salvarlo.
Voi avete suggerimenti da darmi?
Grazie a tutti