Hola, siempre me atrae este tema de guardar imagenes en la base de datos, ya lo he discutido varias veces en algunos foros, y he perdido varias horas buscando la mejor solucion y la mejor manera de hacer esto, y no en vano he dado con una solucion que a mi parecer es una de las mejores que hay y puede ser implementada facilmente ya sea el motor de base de datos MySQL o SQL Server o hasta Access.
algunos dicen que es mejor guardar la ruta de la foto o imagen que se va a guardar, de esta forma entonces no llenamos la base de datos de los bytes que ocupa la imagen, eso es una buena opcion, lo unico que al hacer un backup de la base, las imagenes se pierden y no son "portables", igualmente esto puede ser solucionado limitando al usuario a ingresar solo imagenes inferior a un tamaño determinado, por ejemplo 40kb, de esta forma no se podra llenar la base de fotos gigantes que ocupen espacio.
trabajando en MySQL lo cual no lo he realizado para este caso, creo saber que se utiliza el tipo de campo
LONGBLOB para almacenar el binario de la imagen.
el guille es correcto, usa los metodos
GetChunk y
AppendChunk , como este link:
Ado - método GetChunk AppendChunk hay otra forma parecida, por ejemplo usando la misma clase que provee ADO, llamada
ADO.StreamAdo Stream - Almacenar y recuperar imágenesese es el que yo venia usando hasta hace poco con SQL Server, para eso usaba un campo con el tipo de dato
image (que se usa para guardar binarios de imagenes), lo estaba usando y andaba perfecto.
solo que las contras que le veia eran las siguientes:
1 - no me gusta lo crear el archivo temporal
2 - realiza una consulta extra para obtener el campo de la imagen
3 - solo deja grabar imagenes compatibles con el visual basic, ya sea jpg o bmp, pero ningun otro formato mas.
luego como vi que el campo
image en SQL Server esta en desuso,o sea lo van sacar en versiones futuras, aunque podia seguir usando el tipo de campo varbinary , tuve que buscar una alternativa, me puse a buscar y entonces pude "inventar" si se puede asi decir un metodo que no necesita archivos temporales, ni hacer consultas extra y lo mejor de todo que acepta todos los formatos de imagenes conocidos, hasta PNG con tranparencia alpha.
primero hay que tener el control de usuario llamado
ucImage (grande
cobein), se puede bajar de aqui:
ucImage y ucImageListes un control de usario simple que simula ser un control image, solo que acepta todos los formatos de imagenes, aun los que visual basic no soporta, y lo mas lindo de este control es que tiene un metodo llamado
.GetStream , lo cual obtiene el array de bytes de la imagen que esta cargada en el control, entonces ese array lo podemos guardar directamente en la base de datos, antes de guardarla obviamente debemos hacer una conversion ya que si guardamos el binario de la imagen, que luce algo como esto:
‰PNG...*#%&/()
es lo mismo que abrir una imagen con el bloc de notas, fijense todo ese texto es el codigo de la imagen, todo ese codigo feo es lo que se deberia guardar.
eso no lo podemos guardar asi, debemos codificarlo en lo que se llama
base64, lo cual todo eso feo que vimos antes lo convierte en esto:
gWriYpx/pUj/eWGNuzl993ntePXHmw4NJ0sUEvTvgzYXrinObPZydIwRM/SdNwnx4UAEXg7x3W+q1MRrViDc949UThtiadhmXnt2bnxPowANldinh4EQ+JduhxRuqjeb831zI6W4+nhDCNnxoSg8G4IEg77fqztk6C96o5/LxXUzSEJaQhj2GgMmHByN00knwrfrxDVeajAVrLuQ0V7uXpCEMsRk+Mi3K3lVwsicAF1ubfqt23v0kzeYhqcqojtt4woJpes+w8Oy+wEuPBkub3pHUdzpJc35D50qvGj42rghG4IHaprvTnatqQ+pN5zYUZ98qH09YYmvcY17sUrXaI4AHgry3JfUdJWnCOamXaOM0slFvDr1LoZNr+Z0ESj7cm/IeaNA704+PhHPosgwAE9Evgox4c+BDsjBZBAA07DEtDYb0aE+B3hnwMXCOkA3nnD87AEPM6CjH4A3J6cYvbRuy3g+u5ElPgN4R+Kg2oDcBuBYSFnLd0mip7CltuFinCe2Oc0cJnDtXT9/Kgb5h6QCuWxot13ui0xYs0NsDz//dyEF3oGUqUf7ZrT0aOAD8fwDBU9K1
oXb0pwAAAABJRU5ErkJggg==entonces simplemente guardamos ese string en la base de datos.
para codificar/decodificar en base64 pueden encontrar un modulo clase que tiene todos los metodos necesarios para hacer esto en internet. la conversion a base64 es rapidisima asi que no se hagan problema.
ahora una ves guardado el string, cuando queramos obtener el string, simplemente cuando hagamos la consulta, hacemos lo contrario, ese string lo decodificamos (con la clase de base64) y eso nos devolvera todo el codigo feo que vimos antes, ese codigo feo lo vamos a tener en un array de bytes, y simplemente lo que haremos es asignarle ese array de bytes al control de usuario, que tiene un metodo llamado
.LoadImageFromStream , este metodo lo que hace es crear la imagen de un array de bytes, y como el array de bytes que tenemos es de la imagen, pues el control lo interpreta y crea la imagen en el control.
todo esto que explique parece mucho, pero son 2 o 3 lineas en el programa, asi de simple.
propongo que vean este link, donde esta todo el codigo necesario para hacerlo, el codigo del modulo base64 y demas.
Convertir array de bytes a String y viceversasaludos.