Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Image in Blob field (Web-Application)

  Alt 19. Dez 2020, 23:14
Hallo zusammen,

endlich habe ich einen Weg gefunden, um ein Logo in der Datenbank zu speichern und auch wieder zu laden...

Ich habe meine App komplett auf den Aufruf von Services umgebaut.

Wenn ich das Logo in das TWebImageControl geladen habe, kann ich es jederzeit mit WebImageControl1.Base64 als String bekommen. Ich habe festgestellt, dass ich diesen String zwar problemlos in ein DataSet laden kann, bei dem Versuch, daraus dann ein JSONObject zu machen, wird der String irgendwie verändert.

Ich habe daher selber ein JSONObject erstellt und dieses dem Service-Aufruf als Parameter mitgegeben. Damit funktioniert es.

Delphi-Quellcode:
procedure TDataModule_Client.Save_NewLogo(AOnDataRecieved: TDataRecievedCallback; Image_String: string);
   procedure OnResponse(Response: TXDataClientResponse);
   begin
      if Assigned(AOnDataRecieved) then begin
         AOnDataRecieved();
      end;
   end;

var JSVal: JSValue;
      JSObj: TJSObject;
      JSString:string;
begin
   Try
      JSString:= '{"company_id": '+IntToStr(DataSet_NewCompanycompany_id.AsInteger)+', '+
                 '"picture": "'+'data:image/png;base64,'+Image_String+'"}';
      JSObj:=TJSJSON.parseObject(JSString);
      TVc_XDataWebClient.RawInvoke('ITV_CreateNewCustService.Insert_Logo',[JSObj], @OnResponse);
   Except
      MessageDlg('Es hat einen Fehler beim Speichern gegeben',WEBLib.Dialogs.mtError, [mbOK]);
      Exit;
   End;
end;
Auf der Server-Seite passiert Folgendes:
Delphi-Quellcode:
function TTV_CreateNewCustService.Insert_Logo(JSObj: TJSONObject): integer;
var Query: TFDQuery;
begin
   Query:= TFDQuery.Create(nil);
   Query.Connection:=MySQL.MySQL_Cnnctn;
   Try
      Query.SQL.Clear;
      Query.SQL.Add('insert into company_logo '+
                                       '(company_id, logo_image) '+
                                  'values '+
                                       '(:company_id, :logo_image); '+
                                  'select last_insert_id() as ID ');
      Query.ParamByName('company_id').AsInteger:= StrToIntDef(TJSONString(JSObj.GetValue('company_id')).Value, 0);
      Query.ParamByName('logo_image').AsString:= TJSONString(JSObj.GetValue('picture')).Value;

      Query.Open;
      Result:= Query.FieldByName('id').AsInteger;
   Finally
      Query.Free;
   End;
end;
Auslesen tue ich es mit einem normalen Select und behandle das Ganze wie einen String.

Vielleicht hilft es jemandem weiter.

Vielen Dank für die Unterstützung
Patrick
Patrick

Geändert von Ykcim (20. Dez 2020 um 00:05 Uhr)
  Mit Zitat antworten Zitat