PDA

Ver la Versión Completa : Error de codificación en lasubida de imágenes a una bd con DataSnap


dani36652
18-03-2021, 15:04:36
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:
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:
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 (http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TStringStream.Create).
Haz alguna prueba cambiandola a ver que no sea eso.

dani36652
19-03-2021, 23:49:56
;540379']A la hora de crear Streams, puedes añadir una codificación en el método create (http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TStringStream.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)


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.