Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Error de codificación en lasubida de imágenes a una bd con DataSnap (https://www.clubdelphi.com/foros/showthread.php?t=95124)

dani36652 18-03-2021 15:04:36

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!

Neftali [Germán.Estévez] 18-03-2021 16:58:37

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.

dani36652 19-03-2021 23:49:56

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540379)
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.


La franja horaria es GMT +2. Ahora son las 08:56:47.

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