nel posto in cui ho lavorato fino a poche settimane fa qualche
volta mi è capitato di sviluppare web applications in cui
erano previste delle sezioni nelle quali c'era la necessità
di memorizzare un'immagine.
Qualunque fosse il db utilizzato per la webapp (per lo più
mysql e sql server), noi procedevamo in questo modo:
per prima cosa definivamo il percorso, ossia la (o le)
directory, in cui dovevano essere messe fisicamente le
immagini (non ho voluto scrivere "uploadate", lo so che si
usa così, ma a me questi termini fanno davvero cagare il
cazzo, per cui cerco di non usarli, a costo di usare
lunghe perifrasi). Per definire il percorso, di norma
si andava nel web.xml a mettere una variabile contenente
la stringa del path, in modo che la si potesse poi
chiamare agevolmente e gestire in un unico punto, anche se
mi pare che qualche volta invece il percorso lo
avessimo definito nella classe java in cui si faceva l'upload.
Poi, una volta definito il percorso, nella classe java (la
servlet) facevamo l'upload dell'immagine presa dall'input
file della jsp, e nello stesso metodo si faceva la insert
sul db del nome dell'immagine.
In sostanza:
public void salvaImmagine()
{
eseguiUpload();
salvaNomeImmagineSulDb();
}
questo era in genere lo standard. Se poi si voleva togliere
l'immagine memorizzata, semplicemente si faceva la delete
su db, ed eventualmente la cancellazione fisica del file
(ma non necessariamente).
Poi ovviamente nell'eseguiUpload() se necessario facevamo
altre operazioni, tipo cambiare il nome dell'immagine in
base alle esigenze del progetto stesso (ed è successo
più di una volta, che ne so, mettere la data, o mettere
un id di qualche oggetto, ecc.), e salvando poi
ovviamente su db col nome corretto.
E' chiaro che questo approccio non è perfetto, perché
in pratica, come puoi vedere dallo schemino, tu devi
fare un'unica operazione (salvare l'immagine) e la
trasformi in due operazioni, cioè upload e salvataggio
su db, per cui può benissimo accadere che una va a buon
fine e l'altra no, cosa che naturalmente non è buona.
Con un po' di gestione eccezioni io cercavo di limitare
il rischio, ma d'altra parte se hai due operazioni invece
di una si sa che un po' di rischio rimane.
Però sinceramente devo dire che a me questo approccio
sembra buono, naturalmente in base alle conoscenze che
ho io: una volta mi è capitato di vedere invece un db
(non ricordo che tipo) in cui proprio si memorizzavano
i bit dell'immagine, ma a me sembra una cosa inguardabile,
così.
L'immagine non è mica una stringa o una data, né un numero,
come puoi salvarla su db come se lo fosse? Almeno questo è
quello che penso io.