Seite 1 von 1

Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 22.05.2024 19:53
von dige
Ich poste Daten zu einem Webserver / CGI und erhalte ein PDF gesendet.

Damit lande ich im CGI_CreatePDFCallback(success, Result.s)

In Result.s sind dann das PDF als binäre Daten enthalten.

Frage: wie kann ich die Binärdaten in eine Datei speichern?

Wenn ich einfach WriteString() nehme, sind die Daten verändert und das PDF defekt.
Das gleiche Problem bei dem Umweg über PokeS() und WriteData():

Code: Alles auswählen

Procedure CGI_CreatePDFCallback(success, Result.s)
  Protected *mem

  ; Überprüfen, ob der Callback erfolgreich war
  If success
    ; Öffne die Datei zum Schreiben (binär)
    If CreateFile(0, "myDocument.pdf", #PB_Ascii )
      ; Schreibe die Daten aus Result in die Datei
      ; WriteString(0, Result)

      *mem = AllocateMemory(Len(Result))
      PokeS(*mem, 0, Result, Len(Result), #PB_String_NoZero | #PB_Ascii)
      
      WriteData(0, *mem, 0, Len(Result))

      ; Exportiere die Datei als PDF
      ExportFile(0, "application/pdf", #PB_LocalFile)
      
      ; Schließe die Datei
      CloseFile(0)
    Else
      Debug "Fehler: Datei konnte nicht erstellt werden."
    EndIf
  Else
    Debug "Fehler: Callback nicht erfolgreich."
  EndIf
EndProcedure
Mache ich irgendwas falsch? Bzw. ja, klar ... mache ich .. aber wie gehts richtig?

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 22.05.2024 20:05
von dige
Habe mir das von ChatGPT als Javascript Funktion erstellen lassen - funktioniert auch nicht :-(

Code: Alles auswählen

Procedure CGI_CreatePDFCallback(success, Result.s)

    !       // Konvertiere den binären String in ein Uint8Array
    !       const byteCharacters = v_result;
    !       const byteNumbers = new Array(byteCharacters.length);
    !       for (let i = 0; i < byteCharacters.length; i++) {
    !           byteNumbers[i] = byteCharacters.charCodeAt(i) & 0xFF;
    !       }
    !       const byteArray = new Uint8Array(byteNumbers);
    !
    !       // Erstelle einen Blob aus den Binärdaten
    !       const blob = new Blob([byteArray], { type: 'application/pdf' });
    !
    !       // Erstelle einen Link, um die Datei herunterzuladen
    !       const link = document.createElement('a');
    !       link.href = URL.createObjectURL(blob);
    !       link.download = 'myDocument.pdf';
    !
    !       // Füge den Link zum DOM hinzu, klicke darauf und entferne ihn wieder
    !       document.body.appendChild(link);
    !       link.click();
    !       document.body.removeChild(link);
Endprocedure

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 09:51
von NicTheQuick
Du kannst keine binäre Daten in Strings speichern. Sobald im PDF an der falschen Stelle ein Nullbyte ist, ist der String beendet.

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 09:58
von DarkDragon
NicTheQuick hat geschrieben: 23.05.2024 09:51 Du kannst keine binäre Daten in Strings speichern. Sobald im PDF an der falschen Stelle ein Nullbyte ist, ist der String beendet.
Dachte ich zunächst auch, aber ist das in SpiderBasic auch so? Ich meine in JS ist das nicht der Fall und nutzt SpiderBasic eigene String Typen? Aber generell ist String da gefährlich, auch wegen de-/encoding.

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 10:26
von NicTheQuick
Hoppla :oops:
Mir ist wieder mal nicht aufgefallen, dass wir hier im SpiderBasic-Forum sind.

Dann kann ich auch falsch liegen. Ich hab mit SpiderBasic keine Erfahrung.

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 11:01
von DarkDragon
dige: hast du mal die Binärdaten verglichen von dem was es sein müsste und dem was es abspeichert? Zuerst die Länge, dann hex output?

Unter linux könntest du das so machen:

Code: Alles auswählen

xxd orig.pdf > orig.pdf.hex
xxd spriderbasic.pdf > spiderbasic.pdf.hex
diff orig.pdf.hex spiderbasic.pdf.hex
Um zu sehen was denn genau fehlt/welche Zeichen betroffen sind.

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 11:09
von dige
Am liebsten wäre mir eine Lösung, bei der ich mit WriteData() die Binärdaten speichern könnte.

Da ich Zugriff aufs CGI habe, codiere ich jetzt die Datei mit Base64 vor dem senden und kann das Client seitig wieder entpacken und speichern.

Wüsste aber gern, wie man auch binäre Daten verarbeiten kann..

Re: Binäre Daten aus einem Callback in Datei speichern?

Verfasst: 23.05.2024 18:05
von TroaX
dige hat geschrieben: 23.05.2024 11:09Am liebsten wäre mir eine Lösung, bei der ich mit WriteData() die Binärdaten speichern könnte.
Ich habe eben mal in die Spiderbasic-Doku geschaut. Ich lache immernoch. Mein Tipp: Übergehe den integrierten HTTPRequest, mach ihn nativ über die Fetch-API und schreibe den Response-Body direkt mit WriteDate in eine Datei. Du bekommt in den Callback dank des Null-Byte-Problems wahrscheinlich eh kein vollständges Ergebnis hinein.