Dominik: Binärdaren in Datei speichern

Hallo zusammen,

ich arbeite gerade mit Web Services. Ein Web Service Aufruf (SOAP-Request) erhält hierbei als SOAP-Response ein Binäres Objekt.

Wie kann ich dieses Binäreobjekt als Datei abspeichern?

Ich versuche es gerade hiermit:
function WriteFile($filename, $binary){
 $file = fopen($filename,"wb");
 fwrite($file, $binary);
 fclose($file);
 }

Die Variable binary ist das Binärobjekt und die Variable filename, der Name der Datei unter dem diese abgespeichert werden soll. Leider schreibt mir die derzeitige Lösung das Binärobjekt direkt in die Datei rein. Ich möchte aber aus dem Binärobjket eine Datei erzeugen.

Bin um jede Hilfe dankbar ;-)

Das Binärobjekt sieht so aus:

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPD94bWwtc3R5bGVzaGVldCB0 eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi9DQURfUHJvZHVjdFRyZWUueHNsIj8+Cgo8QXNzZW1ibHkg RG9jdW1lbnROYW1lPSIiPgogPERPS0FSPkRPQzwvRE9LQVI+CiA8RE9LTlI+MDAwMDAwMDAwMDAw MDAxMDAwMDAyNzM0MzwvRE9LTlI+CiA8RE9LVlI+MDA8L0RPS1ZSPgogPERPS1RMPjAwMDwvRE9L VEw+CiA8QXNzZW1ibHkgRG9jdW1lbnROYW1lPSJBbGxnZW1laW5lQW5nYWJlbi5kdGQiPgogIDxE T0tBUj5ET0M8L0RPS0FSPgogIDxET0tOUj4wMDAwMDAwMDAwMDAwMDEwMDAwMDI3MzQ0PC9ET0tO Uj4KICA8RE9LVlI+MDA8L0RPS1ZSPgogIDxET0tUTD4wMDA8L0RPS1RMPgogPC9Bc3NlbWJseT4K IDxBc3NlbWJseSBEb2N1bWVudE5hbWU9IkFsbGdlbWVpbmVBbmdhYmVuLmR0ZCI+CiAgPERPS0FS PkRPQzwvRE9LQVI+CiAgPERPS05SPjAwMDAwMDAwMDAwMDAwMTAwMDAwMjczNTQ8L0RPS05SPgog IDxET0tWUj4wMDwvRE9LVlI+CiAgPERPS1RMPjAwMDwvRE9LVEw+CiAgPFBhcnQgRG9jdW1lbnRO YW1lPSJiaWtlX2ZvcmsucHJ0Ij4KICAgPERPS0FSPkRFUzwvRE9LQVI+CiAgIDxET0tOUj4wMDAw MDAwMDAwMDAwMDEwMDAwMDI3MTE5PC9ET0tOUj4KICAgPERPS1ZSPjAwPC9ET0tWUj4KICAgPERP S1RMPjAwMDwvRE9LVEw+CiAgPC9QYXJ0PgogIDxQYXJ0IERvY3VtZW50TmFtZT0iQUFfYmlrZV9m b3JrLnhtbCI+Ci

  1. echo $begrüßung;

    Wie kann ich dieses Binäreobjekt als Datei abspeichern?
    PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPD94bWwtc3R5bGVzaGVldCB0 eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi9DQURfUHJvZHVjdFRyZWUueHNsIj8+Cgo8QXNzZW1ibHkg

    Das sieht aus, als ob es für den Transport in einem XML-Kontext umkodiert wurde. Welche Kodierung verwendet es? Vielleicht BASE64? Du solltest es zunächst aus dieser Kodierung befreien, dann hast du auch wieder die Rohdaten, die du in eine Datei schreiben kannst.

    echo "$verabschiedung $name";

    1. Hallo,

      die Datei (ein XML-File) wurde vorher über diese Funktion im System eingecheckt:

      function WriteBinary($filepath){
       $handle = fopen ($filepath, "r+b");
       $theData = fread($handle, filesize($filepath));
       fclose($handle);
       return $theData;
              }

      Wenn ich diese Datei dann wieder aus dem System auslese, bekomme ich das vorher gezeigte Binärobjekt. Ich weiss also nicht, wie es kodiert wurde...

      Gibt es trotzdem eine Lösung?

      Grüsse
      Dominik

      1. Hi,

        Wenn ich diese Datei dann wieder aus dem System auslese, bekomme ich das vorher gezeigte Binärobjekt.

        Natürlich, was erwartest Du denn anderes? Schon Deine Frage ist falsch gestellt. Du hast die (kodierten) Binärdaten doch bereits 1:1 in eine Datei geschrieben - fertig.

        Ich weiss also nicht, wie es kodiert wurde...

        Den Hinweis auf BASE64 hat Dir Dominik doch bereits gegeben. Das ist ein übliches Format, was insb. in E-Mail-Anhängen verwendet wird und aus 6-bit ASCII mit festen Zeilenlängen besteht, um evtl. Konvertierungsprobleme zu vermeiden.

        freundliche Grüße
        Ingo

        1. Hallo Ingo,

          wie soll ich das verstehen?
          Ich habe zuvor die Binärdaten doch nicht in eine Datei geschrieben, sonder aus einer Datei in Binärdaten geschrieben.

          Wie bekomme ich also die Binärdaten zurück in einelokale Datei?

          Grüsse
          Dominik

          1. Hallo Dominik,

            wie soll ich das verstehen?

            wie sollen wir Dich verstehen?

            Ich habe zuvor die Binärdaten doch nicht in eine Datei geschrieben, sonder aus einer Datei in Binärdaten geschrieben.

            Wie bekomme ich also die Binärdaten zurück in einelokale Datei?

            a) Die Daten, die Du vom Webservice erhältst sind kodiert
            b) Die Daten, die Du vom Webservice erhältst sind nicht kodiert

            Wenn a) zutrifft, dann dekodiere nach dem Dir bekannten Schema. Der Webservice
            sollte dokumentiert sein, so dass Du aus der Doku problemlos das zu verwendende
            Verfahren entnehmen kannst.

            Wenn b) zutrifft, wo ist Dein Problem?

            Freundliche Grüße

            Vinzenz

            1. Hallo,

              also entweder ich stehe total auf dem Schlauch oder ich habe die Frage falsch formuliert.

              Jetzt nochmal konkret:

              Mit welchem PHP-Code kann ich einen Binärdatenstrom (String) in eine Datei umwandeln und diese speichern?

              Über fwrite() geht es ja anscheinend nicht, da hier der Binärdatenstrom in die Datei geschrieben wird.

              Gibt es hierzu Lösungen in Form von Codebeispielen?

              Grüsse
              Dominik

              1. Hallo

                Mit welchem PHP-Code kann ich einen Binärdatenstrom (String) in eine Datei umwandeln und diese speichern?

                mit fwrite oder auch mit file_put_contents.

                Über fwrite() geht es ja anscheinend nicht, da hier der Binärdatenstrom in die Datei geschrieben wird.

                Das ist gegebenenfalls auch gewünscht.
                Bei Dir offensichtlich nicht. Warum folgst Du nicht den Hinweisen von dedlfix? Er hatte ja schon in seinem ersten Posting darauf hingewiesen, dass die Daten möglicherweise base64-codiert vorliegen.

                Freundliche Grüße

                Vinzenz

                1. Hallo Vinznez,

                  Bei Dir offensichtlich nicht. Warum folgst Du nicht den Hinweisen von dedlfix? Er hatte ja schon in seinem ersten Posting darauf hingewiesen, dass die Daten möglicherweise base64-codiert vorliegen.

                  Okay, und wie kann ich diese codierten Daten dann wieder decodieren? Hast du hierfür eine Lösung?

                  Grüsse
                  Dominik

                  1. Hallo

                    Bei Dir offensichtlich nicht. Warum folgst Du nicht den Hinweisen von dedlfix? Er hatte ja schon in seinem ersten Posting darauf hingewiesen, dass die Daten möglicherweise base64-codiert vorliegen.

                    Okay, und wie kann ich diese codierten Daten dann wieder decodieren? Hast du hierfür eine Lösung?

                    Das hat Dir dedlfix doch schon im verlinkten Posting geschrieben.
                    Lies den letzten Satz. Durch welche Funktion hat er Deine Daten geschickt - und so ein XML-Fragment erhalten?

                    Freundliche Grüße

                    Vinzenz

                    1. Super,

                      danke für den richtigen Hieb in die richtige Richtung.

                      Habe nun den Binärdatenstrom in eine Variable geschrieben. Eine weitere Variable ist dann das base64_decode() der vorhergehenden Variable. Und siehe da, es funktioniert ;-)

                      Besten Dank an alle!

                      Grüsse
                      Dominik

                      OVER und AUS

              2. Hi,
                auch wenn Du nun endlich auf den richtigen Weg gekommen bist, scheinst Du ein Verständnisproblem zu haben was "Binärdaten" und Datei" betrifft.

                Mit welchem PHP-Code kann ich einen Binärdatenstrom (String) in eine Datei umwandeln und diese speichern?

                Diese Frage ist unsinnig. Ein Binärdatenstrom enthält Binärdaten und in eine Datei werden eben diese geschrieben. Die Datei enthält dann die (Binär)daten.
                "Umwandlung in eine Datei" ist völlig falsch ausgedrückt. Daten können in einer Datei gespeichert werden und/oder von einem Format in ein anderes umgewandelt werden.

                Über fwrite() geht es ja anscheinend nicht, da hier der Binärdatenstrom in die Datei geschrieben wird.

                Ähem... genau das wolltest Du doch laut obiger Beschreibung auch erreichen. Denk mal drüber nach.

                freundliche Grüße
                Ingo

      2. echo $begrüßung;

        die Datei (ein XML-File) wurde vorher über diese Funktion im System eingecheckt:

        function WriteBinary($filepath){
        $handle = fopen ($filepath, "r+b");
        $theData = fread($handle, filesize($filepath));
        fclose($handle);
        return $theData;
                }

        Mit dieser Funktion liest du nur die Daten aus, auch wenn du sie (nur hier?) Write... genannt hast. Du bildest damit also file_get_contents() nach, was bereits seit PHP 4.3 zur Verfügung steht. (file_put_contents() gibt es auch, aber erst seit PHP 5.)

        Diese Funktion ist nicht dein Problem. Was machst du anschließend mit den Daten? Behandelst du sie noch irgendwie oder gibst du sie ohne Umwege dem SOAP-Teil? Kümmert der sich um eine für die Übertragung geeignete Kodierung? Wenn ja, warum kümmert der sich dann beim Empfang nicht um eine Dekodierung? Wenn nein, wer kümmert sich dann?

        Wenn ich diese Datei dann wieder aus dem System auslese, bekomme ich das vorher gezeigte Binärobjekt. Ich weiss also nicht, wie es kodiert wurde...

        Die Übergabe zum und vom SOAP-Teil wäre meiner Meinung nach die Stelle, an der man weitersehen muss.

        Unabhängig davon habe ich mal deine Daten durch base64_decode() geschickt und dabei ein XML-Fragment erhalten.

        echo "$verabschiedung $name";