Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-03-2021
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 57
Poder: 6
dani36652 Va camino a la fama
Exclamation Error de codificación en lasubida de imágenes a una bd con DataSnap

Hola a todos excelente comunidad, tengo pensado un sistema para mi ex escuela que consiste en almacenar archivos pdf en una base de datos y posteriormente poder descargarlos.
Planeo un sistema cliente-servidor usando DataSnap server, implementé un código de prueba que al ejecutarlo en Windows, la parte del cliente corre correctamente y si guarda el registro con el parámetro que mando, la cosa está en que cuando intento correr el mismo código en un cliente Android me salta un error con la siguiente descripción: "No mapping for the unicode character exists in the target multi-byte code page"
Paso el memoryStream como string desde el cliente al server.
Código del cliente:
Código Delphi [-]
procedure Registrar();
var 
Registro:TServerMethods1Client;
pic:TstringStream;
MStream:TMemoryStream;
Begin
conexion.connected:=true;
Registro:=TServerMethods1Client.create(conexion.DBXConnection);
pic:=TstringStream.Create('');
MStream:=TmemoryStream.create;
MStream.Seek(0,0);
image1.bitmap.saveToStream(MStream);
pic.copyFrom(MStream, 0);
If Registro.Registrar_Alumnos('Dani',3,20,pic.DataString)=true then
Begin 
ShowMessage('correcto');
End else
Begin
Showmessage('incorrecto');
End;
End;

Código en el server:
Código Delphi [-]
Function Registro(nombre:String; grado:Integer; edad:Integer; foto:WideString):Boolean;
Var
Query:TFDQuery;
Imagen:TmemoryStream;
Begin
  Try
       Try 
 Query:=TFDQuery.Create(Self);
Query.connection:=conexion;
Query.SQL.Clear;
Imagen:=TstringStream.Create(Foto);
Query.SQL.Text:='INSERT INTO alumnos(nombre, grado, edad, foto) VALUES(:nombre, :grado, :edad, :foto)';
Query.ParamByName('nombre').AsString:=nombre;
Query.ParamByName('grado').AsInteger:=grado;
Query.ParamByName('edad').AsInteger:=edad;
Query.ParamByName('foto').LoadFromStream(Imagen, ftblob);
Query.ExecSQL;
        Finally 
FreeAndNil(Query);
FreeAndNil(Imagen);
        End;
Result:=true;
  Except
Result:=False;
  End;
End;
Les agradecería mucho su ayuda gracias!
Responder Con Cita
  #2  
Antiguo 18-03-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.281
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
A la hora de crear Streams, puedes añadir una codificación en el método create.
Haz alguna prueba cambiandola a ver que no sea eso.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 19-03-2021
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 57
Poder: 6
dani36652 Va camino a la fama
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
A la hora de crear Streams, puedes añadir una codificación en el método create.
Haz alguna prueba cambiandola a ver que no sea eso.
Hola amigo Germán, sigo todas tus soluciones y trabajo acerca de Delphi desde mis 16 años hasta ahora que tengo 20. Es nostálgico y de cierta manera eres una persona admirable y ejemplo a seguir.

ENCONTRÉ LA SOLUCIÓN
Resulta que Windows por defecto maneja en los TstringStream la codificación tmbcsencoding, y Android maneja la UTF-8 entonces, con respecto a lo que mencionabas, en el método create del tstringStream puedes definir tanto la codificación o el código de página de dicha codificación y por ende el tstringStream creado tiene dicha codificación. Se me ocurrió la idea de jalar el code page de tmbcsencoding y ponerlo en el método create de mi tstringStream y funciona perfectamente!!! Te agradezco demasiado por darme esa encaminada, ahora puedo subir cualquier archivo no solo imágenes a la base de datos mysql con DataSnap desde un cliente Android, el código queda así: (aclaro que es un código de prueba y la liberación de memoria de los objetos creados en tiempo de ejecución no está escrita)

Código Delphi [-]
procedure Registrar();
var 
Registro:TServerMethods1Client;
pic:TstringStream;
MStream:TMemoryStream;
Begin
conexion.connected:=true;
Registro:=TServerMethods1Client.create(conexion.DBXConnection);
pic:=TstringStream.Create('', 1252); //1252 es el code page de tmbcsencoding
MStream:=TmemoryStream.create;
MStream.Seek(0,0);
image1.bitmap.saveToStream(MStream);
pic.copyFrom(MStream, 0);
If Registro.Registrar_Alumnos('Dani',3,20,pic.DataString)=true then
Begin 
ShowMessage('correcto');
End else
Begin
Showmessage('incorrecto');
End;
End;

Del lado del server todo funciona de maravilla.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error en la codificación JPSepu96 Varios 7 02-08-2015 17:57:05
Datasnap en el cliente da error tulio Desarrollo en Delphi para Android 12 10-06-2014 16:28:00
DataSnap con Imagenes mjjj Providers 1 08-10-2013 20:37:09
Error en insercion con Datasnap rruffino SQL 3 16-03-2010 17:38:02
Error codificación caracteres en web papulo PHP 11 17-11-2006 16:11:25


La franja horaria es GMT +2. Ahora son las 09:20:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi