RESUELTO-Duda en como guardar Imagen en base de datos MySQL

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Que tal colegas, estoy tratando de pasar el ejemplo de R Landaeta viewtopic.php?f=12&t=7272

que usa SQLite3, pero al momento de guardar si guarda todo perfecto el problema es para poder visualizarla que no carga la imagen


dejo el código de guardar y mostrar, el código es adaptado del código del colega R Landaeta


Guardar
local Codigo = Input.GetText("InpCodigo")
local imagen = Input.GetText("inp_product");
local Image = Input.GetText("inp_name_image");
local Path = Input.GetText("inp_path_image");

if Name ~= "" then
	local inn = assert(io.open(Path, "rb"));
	local blob = inn:read("*all");
	MySQLConnection:execute("INSERT INTO "..sourcename..".imagenes(id, codigodeproducto,imagen, imageBLOB) VALUES (NULL, '"..Codigo.."','"..imagen.."','"..Image.."')")
end


Mostrar
MySQLCursor = MySQLConnection:execute("SELECT * From "..sourcename..".imagenes WHERE codigodeproducto = "..Input.GetText("InpCodigo").." ") 
for i = 1, MySQLCursor:numrows() do
   local id, codigodeproducto, imagen, imageBLOB = MySQLCursor:fetch();
		Input.SetText("inp_product", imagen)
	
		output_file = io.open("C:\\fotos\\"..imagen, "wb")
		output_file:write(imageBLOB)
		output_file:close()
	
		Image.Load("avatar","c:\\fotos\\"..imagen);
	end 


Input.SetText("id", "");



Agotaras123 escribió:
30 Abr 2021 18:14
Que tal colegas, estoy tratando de pasar el ejemplo de R Landaeta viewtopic.php?f=12&t=7272

que usa SQLite3, pero al momento de guardar si guarda todo perfecto el problema es para poder visualizarla que no carga la imagen


dejo el código de guardar y mostrar, el código es adaptado del código del colega R Landaeta
Hola, Douglas, ¿te sale algún error o simplemente no la muestra?
no muestra la imagen la descarga pero dañada
revisando desde mysql el código para mostrar las imagen esta bien el problema esta en el código para guardarla

que no guarda correctamente la imagen por ello no se muestra.


puse tu codigo y lo adapte un poco para mysql pero no guarda la imagen

local Codigo = Input.GetText("InpCodigo")
local imagen = Input.GetText("inp_product");
local Image = Input.GetText("inp_name_image");
local Path = Input.GetText("inp_path_image");



local inn = assert(io.open(Path, "rb"));
	local blob = inn:read("*all");
	local q=("INSERT INTO "..sourcename..".imagenes (id, codigodeproducto,imagen, imageBLOB)".."VALUES(NULL,'"..Codigo.."','"..imagen.."', '"..Path.."')")
	local stm = MySQLConnection:execute(q)
	if stm then
		stm:bind_blob(1, blob)
		stm:step()
		stm:finalize()
		Dialog.Message("New data", "The data was saved successfully.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
	else
		Dialog.Message("Error:",products_db:error_message());
	end
dejo el apz del ejemplo malo claro porque no doy como es que se guardan las imagenes en BLOB

Código: Seleccionar todo

https://www.dropbox.com/s/r784iz1bf6ii6q6/Guardar%20Imagen%20en%20MySQL.apz?dl=0
Hola,
La imagen se descarga dañada, porque io.read retorna strings con codificación diferente a la codificación por defecto usada en MySQL, por lo que no se recomienda usarlo, en su lugar te recomiendo transformar el archivo a texto plano con Base64. Y subirlo a la base de datos:

> Subir archivo:
local Content = Crypto.Base64EncodeToString("Image.png", 0)
local SaveAs = "Sample"
MySQLCursor = MySQLConnection:execute("INSERT INTO Images ('Name', 'Content') VALUES ('"..SaveAs.."', '"..Content.."')")
Reemplazar "Image.png" por el archivo que queremos subir, y "Sample" por el nombre con el que queremos identificar ese archivo.

> Descargar archivo:
local ImageName = "Sample"
local SaveAs = "Image.png"
MySQLCursor = MySQLConnection:execute("SELECT * FROM Images WHERE Name = '"..ImageName.."'")
if MySQLCursor:numrows() ~= 0 then
	Crypto.Base64DecodeFromString(MySQLCursor:fetch({}, "a").Content, SaveAs)
else
	Dialog.Message("Error", "File not found.")
end
Reemplazar "Sample" por el archivo que queremos descargar, y "Image.png" por la ruta donde se guardara.

No te recomiendo subir archivos como texto en una base de datos, una imagen de 5MB puede llegar a tardar 20 segundos en servidores como db4free.net, en su lugar usa FTP para enviar archivos y almacenarlos directamente en tu host

Espero que te sirva. Saludos :pc:
Agotaras123 escribió:
02 May 2021 05:55
Dejo el APZz del ejemplo malo claro porque no doy como es que se guardan las imagenes en BLOB
BLOB es solo un tipo de dato, que permite almacenar valores grandes y descargarlos de una manera más eficaz, pero no recomiendo que almacenes así las imágenes.
pexabosh escribió:
02 May 2021 08:24
Hola,
La imagen se descarga dañada, porque io.read retorna strings con codificación diferente a la codificación por defecto usada en MySQL, por lo que no se recomienda usarlo, en su lugar te recomiendo transformar el archivo a texto plano con Base64. Y subirlo a la base de datos:

> Subir archivo:
local Content = Crypto.Base64EncodeToString("Image.png", 0)
local SaveAs = "Sample"
MySQLCursor = MySQLConnection:execute("INSERT INTO Images ('Name', 'Content') VALUES ('"..SaveAs.."', '"..Content.."')")
Reemplazar "Image.png" por el archivo que queremos subir, y "Sample" por el nombre con el que queremos identificar ese archivo.

> Descargar archivo:
local ImageName = "Sample"
local SaveAs = "Image.png"
MySQLCursor = MySQLConnection:execute("SELECT * FROM Images WHERE Name = '"..ImageName.."'")
if MySQLCursor:numrows() ~= 0 then
	Crypto.Base64DecodeFromString(MySQLCursor:fetch({}, "a").Content, SaveAs)
else
	Dialog.Message("Error", "File not found.")
end
Reemplazar "Sample" por el archivo que queremos descargar, y "Image.png" por la ruta donde se guardara.

No te recomiendo subir archivos como texto en una base de datos, una imagen de 5MB puede llegar a tardar 20 segundos en servidores como db4free.net, en su lugar usa FTP para enviar archivos y almacenarlos directamente en tu host

Espero que te sirva. Saludos :pc:

probé tu código si guarda la imagen en base64 pero al momento de descargarla la descarga corrupta no se puede visualizar
Entonces tu base de datos esta limitada, prueba cambiar el tipo de dato a BLOB
esta en blob y es un localhost

Tabla
Imagen

Boton Guardar
Imagen

Boton Mostrar
Imagen


Foto Guardada dañada
Imagen

La imagen en la tabla en binario
Imagen
Resuelto el problema era a la hora de llamar el contenido de la imagen dejo el APZ con las correcciones

Código: Seleccionar todo

https://www.dropbox.com/s/r784iz1bf6ii6q6/Guardar%20Imagen%20en%20MySQL.apz?dl=0
ya funicona correctamente, solo coloquen los datos de su servidor Mysql y creen la base de datos

dejo codigo de la tabla.

Código: Seleccionar todo

CREATE TABLE `imagenes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `codigodeproducto` mediumtext,
  `imagen` mediumtext,
  `imageBLOB` mediumblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;
Agotaras123 escribió:
03 May 2021 06:06
Resuelto el problema era a la hora de llamar el contenido de la imagen dejo el APZ con las correcciones

Código: Seleccionar todo

https://www.dropbox.com/s/r784iz1bf6ii6q6/Guardar%20Imagen%20en%20MySQL.apz?dl=0
ya funicona correctamente, solo coloquen los datos de su servidor Mysql y creen la base de datos

dejo codigo de la tabla.

Código: Seleccionar todo

CREATE TABLE `imagenes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `codigodeproducto` mediumtext,
  `imagen` mediumtext,
  `imageBLOB` mediumblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;
Gracias, Douglas. :friends: Excelente como siempre.
R Landaeta escribió:
17 Jul 2021 06:29
Agotaras123 escribió:
03 May 2021 06:06
Resuelto el problema era a la hora de llamar el contenido de la imagen dejo el APZ con las correcciones

Código: Seleccionar todo

https://www.dropbox.com/s/r784iz1bf6ii6q6/Guardar%20Imagen%20en%20MySQL.apz?dl=0
ya funicona correctamente, solo coloquen los datos de su servidor Mysql y creen la base de datos

dejo codigo de la tabla.

Código: Seleccionar todo

CREATE TABLE `imagenes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `codigodeproducto` mediumtext,
  `imagen` mediumtext,
  `imageBLOB` mediumblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;
Gracias, Douglas. :friends: Excelente como siempre.
Si es recomendable colocar imágenes en un bd, no se cargara mucho
todo depende de como gestiones tus bases de datos y de que manera se realicen las peticiones a la misma, es bueno y no es bueno tambien se toma en cuenta el servidor donde tenes la base de datos hay muchos factores a tomar en cuenta antes de decir si es bueno o no, si es un sistema que tendran muchas peticiones a la vez y lo tienes en una computadora basica y la red esta mal estructurada todo sera lento, como te comento depende de muchos factores.