AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi binären Inhalt z.b PDF in einen String laden
Thema durchsuchen
Ansicht
Themen-Optionen

binären Inhalt z.b PDF in einen String laden

Ein Thema von stalkingwolf · begonnen am 8. Aug 2023 · letzter Beitrag vom 12. Aug 2023
Antwort Antwort
Seite 1 von 2  1 2      
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#1

binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 11:15
Ich stelle mich glaube ich gerade etwas unfähig an.
Ich versuche eine Binäre Datei (z.b PDF,JPG) in einen String zu laden und bekomme nur Teile davon eingelesen.
Ich denke mein Lösungsansatz ist verkehrt.

Was ich machen muss.
Ein Drittanbieter mit welchem wir zusammenarbeiten will per REST-API den Dateiinhalt binär übertragen bekommen.
Allerdings mit einem Boundary drumherum im Body

also z.b
Code:
--__BOUNDARY__--
%PDF-1.3
1 0 obj
<</Type/Catalog/PageLayout/SinglePage/Pages 3 0 R>
.
.
.
--__BOUNDARY__--
Ich habe mehrere Wege probiert z.b
Code:
function LoadFileToString(const FileName: string): ansistring;
    var FileStream: TFileStream;
    begin
        FileStream := TFileStream.Create(FileName, fmOpenRead);
        try
            SetLength(Result, FileStream.Size);
            FileStream.Read(Pointer(Result)^, FileStream.Size);
        finally
            FileStream.Free;
        end;
    end;

    function BinaryoString(const filePath: string): string;
    var fs: TFileStream;
        ms: TMemoryStream;
    begin
        fs := TFileStream.Create(filePath, fmOpenRead);
        try
            ms := TMemoryStream.Create;
            try
                ms.CopyFrom(fs, fs.Size);
                SetString(Result, PAnsiChar(ms.Memory), ms.Size);
            finally
                ms.Free;
            end;
        finally
            fs.Free;
        end;
    end;
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#2

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 11:25
Ich lese den Ansistring in etwa so ein:
Die 1. Funktion habe ich mal etwas angepasst.
Möglicherweise gibt es da auch schon was Fertiges.
Delphi-Quellcode:
function LoadFileToString(const FileName: string): AnsiString;
var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create(FileName, fmOpenRead);
  try
    SetLength(Result, FileStream.Size);
    if FileStream.Size > 0 then
       FileStream.Read(Result[1], FileStream.Size);
   finally
     FileStream.Free;
   end;
end;
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#3

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 11:44
Das ist wie meine oben.

Mein Problem ist das ich das in eine Tstringlist packe damit ich meine Boundary drumherum bekomme und hier wohl was über die Wupper geht, weil danach das Resultat nicht mehr vollständig ist.

Ich habe einmal ChatGTP gefragt und der hat mir TIdMultiPartFormDataStream vorgeschlagen.
Aber dann meckert der Server das angeblich die Form nicht korrekt geschlossen wäre.

Edit : glaube ich habe auf StackOverflow was gefunden was mein Problem löst.
https://stackoverflow.com/questions/...ultipart-mixed

Geändert von stalkingwolf ( 8. Aug 2023 um 11:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 12:10
So vielleicht?
Delphi-Quellcode:
program project1;

uses
  SysUtils, Classes;

procedure ReadBinaryFile(const FileName: string; var Data: AnsiString);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    SetLength(Data, Stream.Size);
    Stream.ReadBuffer(Data[1], Stream.Size);
  finally
    Stream.Free;
  end;
end;

procedure WriteBinaryFile(const FileName: string; const Data: AnsiString);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    Stream.WriteBuffer(Data[1], Length(Data));
  finally
    Stream.Free;
  end;
end;

var
  head, foot, data: AnsiString;
begin
  head := '--__BOUNDARY__--' + LineEnding + '%PDF-1.3' + LineEnding + '1 0 obj' + LineEnding + '<</Type/Catalog/PageLayout/SinglePage/Pages 3 0 R>' + LineEnding;
  foot := LineEnding + '--__BOUNDARY__--';
  ReadBinaryFile('.\file.bin', data);
  WriteBinaryFile('.\file.bin' + '.new', head + data + foot);
  ReadLn;
end.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 12:59
Grundsätzlich: Eine binäre Datei wird auch binär gelesen, damit man nicht bei der StringBearbeitung kaputt macht.
* gut, Delphi-Strings haben kein Problem mit einer #0 im String
* aber z.B. bei einer TStringList der TFile.ReadAllLines die Zeilenumbrüche
* und vor allem Konvertieurungen, bei der Behandlung der Datei mit einer "falschen" CodePage.


Deine Codes lesen definitiv immer alles, ABER

* wegen dem "String" beim zweiten Code, ist natürlich der halbe String am Ende "leer".
string = hat seit Delphi 2009 zwei Bytes pro Char

* und weil du keine Fehlerprüfung hast, könnte auch weniger gelesen werden (hier an deinen Beispielen aber nicht, außer z.B. Dateisystem oder Datenträger sind kaputt)
-> Read und dessen Result prüfen, oder eben ReadBuffer




TStream / TMemoryStream, TFileStream, TStringStream
RawByteString
TBytes

Delphi-Referenz durchsuchenTFile.ReadAllBytes
Delphi-Referenz durchsuchenTFile.ReadAllText aber hier möglichst mit einer ANSI- ASCII-CodePage arbeiten, weil wegen String/UnicodeString
es gab auch mal irgendwo eine CodePage ohne Umrechnung, wo #0-#255 1:1 umgesetzt werden, ohne Konvertierung
https://learn.microsoft.com/en-us/wi...ge-identifiers
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Aug 2023 um 13:19 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#6

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 14:03
mit TFile hatte ich auch schon getestet.

Mein Problem war das in der Test PDF welche ich genutzt habe in einem der Stream Parts ein Nullzeichen enthalten war und somit immer exakt dort Ende war.

Hatte mir das ganze nun in einen Stream, dann diesen auf die Platte geschrieben. Sah alles gut aus.
Als ich per Copy&Paste das ganze in den RESTClient kopieren wollte hatte ich wieder den gleichen Teil eingefügt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: binären Inhalt z.b PDF in einen String laden

  Alt 8. Aug 2023, 14:57
Mein Problem war das in der Test PDF welche ich genutzt habe in einem der Stream Parts ein Nullzeichen enthalten war und somit immer exakt dort Ende war.
Definitiv NEIN, also auf den String bezogen.

Wie/wo schaust du dir denn den Inhalt des Strings an?
* Debugger sagt alles OK
* in ein TMemo kopiert oder an ShowMessage übergeben ... ja, selbst Schuld, da PChar und nicht Delphi-String

Und nun rate mal, warum man Binärdaten möglichst nicht in Strings packt. (ja, es geht, wenn man aufpasst, aber)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: binären Inhalt z.b PDF in einen String laden

  Alt 9. Aug 2023, 10:37
Ich verstehe nicht warum die PDF in einen String geladen werden muss

1) Schreib "--__BOUNDARY__--" in einen (Memory)Stream
2) Lade die PDF in einen 2. Stream und kopier den Inhalt danach in den 1. Stream mit CopyFrom
3) Schreib "--__BOUNDARY__--" in den Stream
4) Stream versenden
5) Fertig
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#9

AW: binären Inhalt z.b PDF in einen String laden

  Alt 9. Aug 2023, 11:23
Oder encodiere den binären Stream zu Base64 (https://docwiki.embarcadero.com/Libr...Base64Encoding) packe ihn problemlos in Deinen String und decodiere ihn wieder zurück, wenn Du am Ziel bist.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#10

AW: binären Inhalt z.b PDF in einen String laden

  Alt 9. Aug 2023, 16:15
Ich verstehe nicht warum die PDF in einen String geladen werden muss

1) Schreib "--__BOUNDARY__--" in einen (Memory)Stream
2) Lade die PDF in einen 2. Stream und kopier den Inhalt danach in den 1. Stream mit CopyFrom
3) Schreib "--__BOUNDARY__--" in den Stream
4) Stream versenden
5) Fertig
weil ich ganz den Body in einer Tstringlist zusammenbauen wollte bzw. wir das so machen und dann an IDHTTP übergeben.
Aber normalerweise machen wir das immer Base64 codiert nur dieser Anbieter will es halt binär.

Ich habe das ganze Thema nun auch über einen Stream gelöst und genau so wie du oben beschrieben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz