¿Se pueden pasar imagenes con cirrus?


([N1] josemanuel) #1

Buenos días, estoy haciendo una aplicación de movil, y me gustaria saber si con cirrus puedo pasar imagenes al movil.Ya veo datos y me gustaria saber si se puede.En caso de que la respuesta sea negativa me gustaria saber como hacerlo.

Muchas gracias.


([N1] wikan) #2

@jcmcf3, monta un servidor web y devuelve las imagenes por ahí.

Saludos


([N4] bitcodesoft) #3

No he utilizado cirrus, pero si codificas la imagen en base64, puedes mostrarla en cualquier navegador:

(data:image/jpeg) Puedes utilizar png,gif,bmp Etc.



([N1] josemanuel) #4

Muchas gracias, lo que quiero evitar es montar un servidor web, ya que cirrus me deja recibir información sin montar nada, cosa que es una MARAVILLA, era saber eso.


([N1] angelcastillo) #5

Hola, alguien pudo probarlo o sabe enviar imagenes?

Yo he probado codificacion Base64 como dijo Bitcodesoft directamente en el codigo html y funciona, pero no se enviar la imagen en esa codificacion desde mi variable VImage recogida desde una de mis tablas.

Habeis hecho algo por el estilo?


([N1] angelcastillo) #6

Vale, he encontrado una funcion javascript que codifica a base64. Voy a probarla

Un saludo.


([N4] Jorge) #7

Es complejo… pero se puede. Hacerlo en binario es difícil y poco funcional por culpa de la poca flexibilidad del protocolo tcp/ip. Como bien apuntas se puede hacer en base64 y con algunas mejoras en cirrus. Puedes ver la solución dentro del código fuente de PaaSOS

http://tipesoft.com


([N1] Mario) #8

Buenos días, lo puedes hacer al vuelo para que cuando se pida una imagen la convierta a base 64 y así no te ocupe doble espacio en disco, pero hay un bug que no permite la conversión de una imagen en la base de datos a base 64 sin pasar previamente por guardar en disco y leerlo, así que por el momento, eso no lo veo factible, ya que en caso de ser muchas imágenes ralentizaría mucho.

Si quieres, cuando guardas una imagen, puedes hacer lo siguiente desde un evento de un formulario y guardar la imagen tanto en formato binario como base 64

//Importamos la clase para su uso
importClass("VImage");
//Guardamos la senda del fichero a añadir
var senda = theMainWindow.fileDialogGetOpenFileName( "Seleccione la foto. Recomendamos que sea de 90x90 y ha de ser formato png.", "", "*.png");
//Creamos la imagen
var img = new VImage();
if ( img.load(senda) )
    {
		//Capturamos el campo imagen
		var edFoto = theRoot.dataView().control("IMG");
		//Si es mayor que lo parametrizado, lo escalamos
		var anchoMaximo = 90;
		edFoto.readOnly = 0;
		edFoto.setImage(img.scaledToWidth(anchoMaximo, 0));
		edFoto.readOnly = 1;
		var imagenByteArray = new VByteArray();
		imagenByteArray = img.saveToData("PNG", -1);
		imagenBase64Txt = imagenByteArray.toBase64().toLatin1String();
		theRegisterIn.setField("IMG B64", imagenBase64Txt )
		theRoot.dataView().updateControls();
    }
else
    alert("No se ha podido cargar la imagen");

Ahora sólo te quedaría retornar el valor del campo objeto texto que contiene el “churro” del base 64 en cirrus. Nosotros lo utilizamos y va perfecto.

Saludos


([N1] angelcastillo) #9

Hola a todos y gracias a Jorge y Mario.

Estuve haciendo pruebas y el proceso de convertir a Base64 funciona bien pero lo malo era cargar el archivo desde la base de datos, yo pense que el problema era por el bug que decia Mario y empecé a coger las imagenes de la tabla y a pasarlas a disco y funcionaba, pero al final vi que era un problema de archivos nulos y he podido hacer el proceso de forma directa y me parece que carga bastante rapido.

Es decir cojo la imagen de la base de datos como VImage, lo transformo a VByteArray y lo paso a Base64 del tiron sin pasar por disco. Mas o menos como el codigo de Mario.

Esto mismo cre que tambien podrá servir para envio de archivos, cosa que tengo pendiente de probar. Muchas gracias


([N1] Mario) #10

Buenos días, ¿has podido convertir las imágenes desde una tabla a base64 sin pasar por el disco duro?
A ver si puedes poner un ejemplo…

Saludos y gracias


([N1] angelcastillo) #11

Si claro.
Esto a simple vista es lo que cualquiera pensaria que debe funcionar, y la verdad funciona, pero cuidado:

	var articulo = articulos.readAt(z)
	var foto = articulo.fieldToImage("FOT")
	var fotoB64 = foto.saveToData("PNG", -1) //fallo del proceso si no hay imagen
	fotoB64 = fotoB64 .toBase64().toLatin1String()
	articulosWeb.push({foto: fotoB64}) 

porque si el campo imagen esta vacio el proceso falla y no devuelve nada a cirrus. Esto me hizo pensar que era el bug, pero no hay bug que yo sepa en esta version 7.16. Tu codigo no falla porque la imagen esta cargada de un archivo, con lo que no hay fallo de imagen vacia nunca. Incluso si intentas:

	if(!foto.isNull()){   //tambien rompe el proceso si está vacia la imagen y cirrus no devuelve nada, 
			      // y me duele que rompa una funcion .isNull(), me hace perder el tiempo
		var fotoB64 = foto.saveToData("PNG", -1) //fallo del proceso si no hay imagen
		fotoB64 = fotoB64 .toBase64().toLatin1String()
		articulosWeb.push({foto: fotoB64})
	}

Así que si todos los campos imagen estan rellenos aunque sea una imagen blanca, el proceso .toB64() no falla. Es una tonteria pero justo que todas las pruebas las haces con 10 registros, no todos tienen imagen, para que rompa el proceso. Suerte que probe con un unico registro en la tabla que si tenia imagen.


([N1] vgegeo) #12

Buenas
¿Es posible devolver el string en Base64 de una imagen conociendo la senda de la misma, sin que este guardada en la propia base de datos?

Gracias

EDITADO: Nada, que estoy de lunes y no me entero


([N1] vgegeo) #13

Nada, no he dicho nada, que estoy espeso