Guardar imagen desde javascript


([N1] rid0406) #1

Saludos a todos
Me gustaría saber si es posible guardar una imagen en un campo Objeto Dibujo desde javascript, tengo una aplicación que recibe un base64 de una imagen con lo que puedo transformarlo en un objeto VImage pero a la hora de guardarlo en el campo me salta un error de ambigüedad a la hora de redactar el setField();

Quisiera saber si es posible y de ser así como debería ser.

El código que he usado es este:

var oTexto = new VByteArray();
var oByteArray = new VByteArray();
var oImage = new VImage();

oTexto.setText(theRoot.varToString(“BASE64”));
oByteArray.fromBase64(oTexto);

if (oImage.loadFromData(oByteArray, “”)) {
theRegisterIn.setField(“NAME”, “Daniel”);
theRegisterIn.setField(“IMAGEN”, oImage);
theRoot.dataView().saveRegister();
}

Att Daniel


([N1] wikan) #2

Según la documentación tienes que usar setFieldImage
http://velneo.es/info_v7_717_es/velneo_vdevelop_v7/scripts/clases/core/vregister/#setFieldImage


([N1] desarrollo) #3

Buenas!
Me ha costado sangre (lo dejaremos ahí) hacer que esto funcione debido a mi nula (nula, nula, nula!) comprensión de JavaScript. Viendo este post y algún ejemplo de Paco Satué (Gracias a todos!!!) he podido hacer lo que me proponía: utilizando funciones remotas entre servidores v7, dar de alta registros con imágenes de un servidor a otro.
Esto lo teníamos resuelto exportando la imagen en un sitio y capturándola desde el otro con el getFicheroUrl y después con el ‘Importar imagen’…pero como para hacer pruebas estamos ahora utilizando el servidor de v7 para desarrollo de Velneo en el que no hay montado un Apache, he intentado hacerlo de esta otra forma.
Para la exportación, desde la función remota llamada, disparamos este proceso, en el que grabamos en una variable local del proceso, el resultado de la exportación a Base64 del objeto imagen del registro en curso:

//Importamos la clase para su uso
importClass(“VImage”);
//Creamos la imagen
var img = new VImage();
var imagenByteArray = new VByteArray();
img=theRegisterIn.fieldToImage(“IMAGEN”);
imagenByteArray = img.saveToData(“JPG”, -1);
imagenBase64Txt = imagenByteArray.toBase64().toLatin1String();
theRoot.setVar (“IMG_EN_B64”, imagenBase64Txt);

La función remota devolverá, entre otros, esa variable local, que trataremos en el formulario que llamó a la función mediante un manejador de evento como este:

//Importamos la clase para su uso
importClass(“VImage”);
importClass(“VByteArray”);
// Desde una cadena Base64 obtenemos una imagen en memoria
var oTexto = new VByteArray();
var oByteArray = new VByteArray();
var oImage = new VImage();
// Formulario contenedor
var oForm = theRoot.dataView();
// Cadena Base64 con la imagen
var cBase64=theRoot.varToString(“IMG_EN_B64”)
// Cargamos el Texto en Base64
oTexto.setText(cBase64);
// Obtenemos el ByteArray con el contenido original de la imagen
oByteArray.fromBase64(oTexto);
// Objeto Imagen
//var oImg = oForm.control(“IMAGEN”);
// Obtenemos el objeto Imagen
oImage.loadFromData(oByteArray,‘JPG’);
theRegisterIn.setFieldImage (“IMAGEN”, oImage);
theRoot.dataView().updateControls();

Saludos,

César