Newsgroup: it.comp.lang.visual-basic
Titolo: [?/!] come ricevere immagini da database?

ciao.
la prima domada di oggi e' semplice da fare. un po' meno facile darle
una risposta ottima, forse.
con gli amici di it.comp.database ne ho gia' discusso e vi propongo la
soluzione a cui siamo arrivati, perche' mi servirebbe una mano per
implementarla. naturalmente, soluzioni alternative sono bene accette.
parte [?]
problema: salvare ed estrarre immagini da un database.
restrizioni:
- non e' possibile utilizzare il tipo di dati blob
- l'applicazione deve funzionare in lan ma anche via internet
- le immagini devono obbligatoriamente risiedere sul server
note:
- le immagini sono relativamente poche: saranno si' e no 2.000/2.500
- le immagini sono relativamente grandi: 200/500kb l'una
- il problema della sicurezza quasi non esiste. un accesso limitato da
password e' meglio ma non vincolante
parte [!]
la soluzione che pare essere la migliorie e' la seguente [1]:
- si mette sul server un server web
- le immagini vengono salvate come normali file sul server --cioe',
*fuori* dal db--
- nel db vengono salvate solo le locazioni e le informazioni
sull'immagine --nome, dimensione, orientamento, blablabla--
- il client per ricevere un'immagine "passa attraverso" uno scriptino
in php, che riceve qualche parametro di ricerca e restituisce il file
corrispondente --cioe' l'immagine--
- il client, eventualmente, salva il file ricevuto su disco --non so
ancora se voglio farlo, ma vorrei partire con l'idea di farlo--
ritorniamo alla parte [?]
la cosa sembra di una facilita' disarmante, salvo il fatto che:
- non ho un'idea neanche vaga di come si faccia a chiedere ad un
server web una pagina --che nel mio caso di fatto e' il passaggio allo
script di alcuni parametri--
- non ho un'idea neanche vaga di come si riceva un file dal suddetto
server web
qualche consiglio?
come sempre, grazie in anticipo.
saluti.
[1] io avevo pensato ad un'altra soluzione che era piu' pesante per il
client ma *molto* facile da implementare.
le immagini sono salvate nel db in piccoli pezzi lunghi al max MAXCHAR
caratteri, con MAXCHAR massima lunghezza di una stringa nel db. ad
esempio, in access 255 caratteri e in pgsql 2000.
questi pezzi sono numerati e quando voglio riceverli faccio una select
bla,bla,bla from bla, order by posizione. fatto questo, scrivo su un
file locale i pezzi uno dopo l'altro, poi faccio una loadpicture e
sono a posto. tra l'altro, cosi' ho anche gia' salvato il file su
disco :)
il problema di questa soluzione e' che in rete locale va che e' una
meraviglia, ma via internet, non potendo usare odbc o connessioni
"dirette" al motore db, non e' ugualmente funzionale. e se devo
passare attraverso uno script php tanto vale che adotti l'altra
soluzione, piu' "pulita" e computazionalmente leggera.
l'idea dei pezzi salvati in ordine la utilizzo gia' per i testi che
salvo nel db, da cui mi era venuta l'idea di farlo anche per le
immagini. anziche' avere 20 righe di 250 caratteri ne avrei 1.000, ma
il concetto e' quello :)
-- 
Gianni Rondinini
Icem s.r.l.
Tel: 
+39 0545 78036
Fax: 
+39 0545 78727

 "dirette" al motore db, non e' ugualmente funzionale.
Ovviamente l'immagine deve passare per intero tramite la rete :)
Se vuoi maggiori info prosegui il thread.
Ciao
--
using System.Gtk.Forms = "
http://www.neodatatype.net/windowsforms/sgf.aspx
"
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"

 qualche consiglio?
la strada di sopra e' quella migliore e + rapida imVVho !

qualche consiglio?
Se ho capito, con un controllo inet puoi fare tutto.
Poniamo di voler scaricare l'immagine apache_pb.gif dal server web:
<codice>
Option Explicit
Private Sub Form_DblClick()
    Inet1.Execute "
http://localhost/apache_pb.gif
", "GET"
End Sub
Private Sub Inet1_StateChanged(ByVal State As Integer)
   If State = icResponseCompleted Then
      Dim blob() As Byte, varTemp As Variant, nFile As Integer
      blob = Inet1.GetChunk(1024, icByteArray)
      nFile = FreeFile()
      Open "D:\prova.gif" For Binary Access Write As #nFile
      Put #nFile, , blob
      Do While True
         blob = Inet1.GetChunk(1024, icByteArray)
         Put #nFile, , blob
         If Len(varTemp) = 0 Then
            Close #nFile
            Exit Do
         End If
      Loop
   End If
End Sub
</codice>
-- 
hth, hal


wrote:
rettifico, quando mi decidero' a provare il codice prima di
pubblicarlo? :-(
Private Sub Inet1_StateChanged(ByVal State As Integer)
   If State = icResponseCompleted Then
      Dim blob() As Byte, varTemp As Variant, nFile As Integer
      varTemp = Inet1.GetChunk(1024, icByteArray)
      If Len(varTemp) = 0 Then Exit Sub
      nFile = FreeFile()
      Open "D:\prova.gif" For Binary Access Write As #nFile
      blob = varTemp
      Put #nFile, , blob
      Do While True
         varTemp = Inet1.GetChunk(1024, icByteArray)
         If Len(varTemp) = 0 Then
            Close #nFile
            Exit Do
         End If
         blob = varTemp
         Put #nFile, , blob
      Loop
      Debug.Print "a"
   End If
End Sub
-- 
sorry, hal

Ovviamente l'immagine deve passare per intero tramite la rete :)
si' e no. nel senso che internet e' "solo" un pelo piu' grande e lenta
--nel complesso-- della mia rete locale. il file attualmente, con la
mia soluzione taglia-cuci-e-spera-in-dio (r) gira spezzettato in rete
locale e viene ricomposto sul client: via internet potrebbe essere la
stessa cosa, salvo naturalmente impiegare piu' tempo per riceverlo.
diciamo che io potrei anche ragionare cosi':
- quando avro' sistemato un po' di cose, cambiero' di nuovo il sito
attuale
- il sito nuovo avra' una grossa fetta dinamica, tra cui news, area
mercato --riservata agli agenti, che sono gli stessi potenziali utenti
del mio programma per i libretti uso e manutenzione-- e cosi' via
- tale fetta dinamica la faro' in php, per i motivi che ho accennato
prima
di conseguenza, il server che portero' dal mio provider avra'
apache+php funzionanti e potrei utilizzare la stessa macchina per
metterci su anche le immagini.
fin qui, entrambe le soluzioni --cioe' files tagliati ed inseriti nel
db + odbc e files interi su disco + php-- restano possibili.
alcune considerazioni:
a questo punto avrei disponibile un server con nome registrato nei dns
del caso ed ip statico pubblico, quindi raggiungibile da chiunque.
il problema ora e': non e' che a voler mettere un dsn di sistema a
casa dei miei utenti --per utilizzare odbc-- mi complica troppo la
vita? anche perche' per farlo dovrei prima fargli installare il driver
odbc di pgsql e ho davanti della gente che non e' in grado manco di
copiare dei modelli di word da un cd --che gli ho spedito per posta--
al loro disco fisso nella directory modelli di word...
e a creare un dsn di sistema via codice --ad esempio, alla prima
esecuzione del programma-- non sono capace e oramai c'ho dato su, dopo
aver scomodato tutti i santi del calendario, compreso il 29 febbraio,
2 volte.
e' a questo punto che diventa molto allettante la soluzione del
trasferimento via http dopo aver fatto una richiesta tramite uno
script php: quel povero impedito del mio utente dopo aver installato
--e questo e' *molto* facile-- il mio programma non deve piu' fare
altro: ne' driver odbc, ne' pannello di controllo, ne' niente di
niente.
pero' queste sono considerazioni fatte su 2 piedi: non e' detto che
niente di quanto sopra sia effettivamente corretto :)
la tua soluzione in cosa consisteva?
naturalmente, grazie per il tuo aiuto.
saluti.


la strada di sopra e' quella migliore e + rapida imVVho !
infatti non e' niente di complicato, non appena avro' capito che
controllo usare o come comportarmi per collegarmi al server web.
ciao e grazie :)


   End If
ok, ora e' tutto piu' chiaro.
a dirla tutta, continuo a non ricevere lo stato completed, ma abbiamo
gia' fatto un passo avanti :)
mi si ferma su icResponseReceived.
ho provato anche con nomi di file piu' "diretti", tipo
Inet1.Execute "
http://192.168.35.184/viper.jpg
", "GET"
ma il risultato e' lo stesso.
altri suggerimenti?
baffo d'oro [1] in arrivo :)
saluti.
[1] se preferisci puoi cambiarla con una heineken da 66 o una faxe da
1 litro :)


         If Len(varTemp) = 0 Then
questo e' appena un pelo piu' nebuloso. uso blob per prendere giu' i
bytes e poi scriverli nel file, ma varTemp a cosa serve? non la
inizializzo mai a niente :?
per le mie prove ho messo Len(blob) e mi sembra che funzioni, ma
magari mi era sfuggito altro.
quando vieni a ritirare la tua piadina con rucola e squacquerone? :)
se mi aiuti ancora un po' ci aggiunto una baffo d'oro da 66cl ;)
ciao e grazie tantissime.


altri suggerimenti?
boh, non ho fatto niente ma dopo un po' ha iniziato a funzionare :)
ora e' tutto ok.
ciao ed a presto.


 ora e' tutto ok.
forse era il campo Birra settata su "Baffo D'Oro" che gli dava problemi , a
me invece non ne da' nessuno posso apprifittarne  ?

me invece non ne da' nessuno posso apprifittarne  ?
Mettiti in coda :-P
-- 
ciao, hal

 controllo usare o come comportarmi per collegarmi al server web.
ho visto che hai seguito la strada del campo blob ... vabbe' il mio esulava
un po dal Vb e faceva uso di semplice codice PHP , maturalmente sia l'input
che output erano riversate su IE

me invece non ne da' nessuno posso apprifittarne  ?
puo' darsi: a parlare di birra a casa del birro a volte il sistema
s'incasina perche' non capisce piu' se si tratta della bionda moglie
del suddetto romagnolo doc oppure della bionda della bottiglia dello
stesso romagnolo :)
il passo, in effetti, e' breve...
per evitare di confondermi, infatti, spesso le prendo entrambe anche
io %)
saluti.


Mettiti in coda :-P
quando vieni giu' per la morettona, se vuoi passare a prenderlo... :)
saluti.


un po dal Vb e faceva uso di semplice codice PHP , maturalmente sia l'input
beh, a dire la verita' non e' esattamente cosi': php mi passa un file
che legge da disco, non che estrae dal db.
io passo un parametro a php che indica quale immagine voglio. lui
interroga il db e vede a che file corrisponde quel parametro --in
realta' saranno piu' parametri nella versione definitiva--, poi mi
restituisce il file letto direttamente su disco.
se ho ben capito --e spero vivamente di si'-- il discorso blob sarebbe
un discorso che mi fa salvare *dentro* al db *l'intero* file, e non
solo un riferimento ad un file che risiede su disco.
comunque un grazie anche a te per aver partecipato alla discussione :)
saluti.


 la tua soluzione in cosa consisteva?
Dato che si parlava di VB, ho usato un GetChunk/SetChunk sul campo blob.


Dato che si parlava di VB, ho usato un GetChunk/SetChunk sul campo blob.
ci butto un'occhio e lo tengo presente.
per ora resto aperto a tutte le possibilita', anche se il
trasferimento con l'oggetto inet mi sta orgasmando abbastanza per la
sua semplicita' e funzionalita' :)
mi resta solo un po' di dubbio su come uploadare le immagini sul
server: non so se via http sia possibile o se debba "aprirmi" qualche
altra strada.


 altra strada.
Potresti guardare come fa il forum bbphp (open source in php) per fare
l'upload nel db delle immagini dei partecipanti.
Ciao

ho sfogliato ultimamente non ne ho trovata traccia.
E' proprio solo di Access.
Per i blob pero' (se si parla di Access) quello che piu' si avvicina
ai tipi degli altri db e' il Long Binary piuttosto che il Memo.
-- 
ciao, hal

 ai tipi degli altri db e' il Long Binary piuttosto che il Memo.
Ah, ok.
Long binary č un sinonimo di blob.
Mi sembra strano che non esista.

ai tipi degli altri db e' il Long Binary piuttosto che il Memo.
oddio, diciamo che per il --breve, spero-- periodo di test "locali"
utilizzo access, ma poi la mia applicazione lavorera' appoggiandosi su
pgsql.
ma a dirla tutta sarei orientato verso l'utilizzo della soluzione con
php di cui avevamo parlato altrove. sono quasi sconcertato dalla
--apparente-- semplicita' della cosa :)
aspetto di vedere l'altra faccia della medaglia dove stara' ;)
