Base64-String zu Datei

Hallo zusammen,

ich bin schon einige Male in Straucheln gekommen bei dem Versuch, aus einem base64-kodierten String wieder eine Datei zu machen. Für eine Datei kriegt man das noch hin, indem man über TextHTMLWriter → StringToFile geht und im StringToFile mit dem Modus „Base64 Zeichenkette in Binärdatei“ arbeitet.
Nur habe ich natürlich mehrere Dateien bzw. Zeilen und würde viel lieber mit TextHTMLWriterMultiOutput arbeiten. Hier krätscht aber immer das Encoding rein und lässt sich irgendwie auch nicht ausschalten. Übersehe ich da was? Ich habe eine Reihe von PDFs in Base64, welche ich als Datei haben möchte, um sie auf einen FTP zu schieben.

Außerdem bin ich bei Arbeiten mit dem TextHTMLWriterMultiOutput grade darüber gestolpert, dass es ja sowohl ein encoding im Aufruf der „output“-Funktion gibt und dann nochmal einen Dropdown in der Stepkonfiguration. Wie interagieren die mit einander? Ich habe heute zum ersten Mal das Dropdown in der Stepkonfiguration zur Kenntnis genommen.

Gruß
Gustav

Hallo Gustav,

Eigentlich sollte es mit der decodeBase64 auch im TextWriterMultiOutput Step funktionieren. Ich bin mir leider nicht ganz sicher, an welcher Stelle das encoding bei dir „rein krätscht“. Wichtig ist, das die output Funktion, das gleiche encoding verwendet wie decodeBase64. Ich habe es mit einer base64 - kodierten pdf getestet und das hat funktioniert:

<#list spreadsheet@SpreadsheetMapper_53.getRows() as row>
  ${output(decodeBase64(row.get("base64"),"UTF-8"), "myTestFile1.pdf", "UTF-8")}
</#list>

Falls du ein Beispiel base64-String hast, der nicht funktioniert, kannst du ihn mir gern per Ticket schicken.

Das ausgewählte encoding im Step ist das „default“ encoding der output-Funktion. D.h. wenn du bei output() den 3. Parameter weglässt, wird das ausgewählte encoding verwendet.
Beispiel:
${output(decodeBase64(inputString, "myTestFile1.pdf")}

Wenn ein encoding bei der output() Funktion angegeben ist, dann wir immer dieses verwendet (Step Einstellung ignoriert).

VG Torsten

Wir konnten das Thema per Mail klären, danke an Torsten!

Falls jemand anderes über das Thema stolpert: Man muss sowohl in der decodeBase64-Funktion als auch in der Output-Funktion ein anderes Encoding als UTF-8/UTF-16 benutzen.
In den UTF-Encoding sind nämlich nicht alle Bytefolgen einem Zeichen zugeordnet und werden dann durch des Ersetzungszeichen � ersetzt.

ISO-8859-1 und ISO-8859-15 haben keine solche Lücken in der Codepage und funktionieren deshalb. Mit folgendem Freemarker-Code hat es also geklappt.

${output(decodeBase64(base64_encoded_pdf, „ISO-8859-1“), „test.pdf“, „ISO-8859-1“)}

Gruß
Gustav

1 „Gefällt mir“