Stefan B¡on: Inhalt eines Zip-Archivs in Variable einlesen

Moin zusammen,

ist wahrscheinlich ganz einfach, aber ich komm' nicht drauf: Wie kann man den (binären) Inhalt eines Archive::Zip-Objektes in eine Variable einlesen? Über den Umweg einer Datei geht's zwar ...

$zip->writeToFileNamed("tmp.zip");
open(HANDLE_ZIP, "tmp.zip");
my $zipData = <HANDLE_ZIP>;

... aber das ist ja wie "von hinten durch die Brust ins Auge"... ;-)

Gruß,
Stefan

  1. 你好 Stefan,

    Wie kann man den (binären) Inhalt eines Archive::Zip-Objektes in eine Variable einlesen? Über den Umweg einer Datei geht's zwar ...

    $zip->writeToFileNamed("tmp.zip");
    open(HANDLE_ZIP, "tmp.zip");
    my $zipData = <HANDLE_ZIP>;

    ... aber das ist ja wie "von hinten durch die Brust ins Auge"... ;-)

    Würde ich mit IO::String machen:

      
    use IO::String;  
    use Archive::Zip;  
      
    # create Zip archive  
      
    my $str = '';  
    my $fh = IO::String->new($str);  
    $zip->writeToFileHandle($fh);  
    
    

    再见,
     克里斯蒂安

    --
    Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
    Gernot Back: Was ich damit sagen will: Dein Gelaber fängt an, sogar mich zu nerven.
    http://wwwtech.de/
    1. 你好 Christian,

      (was immer auch "你好" heißt - ich hoffe, etwas Nettes *g*)

      cool, danke, das probiere ich mal aus.

      Noch ein Problem ist mir untergekommen: Wenn in den ZIP-Daten ein Byte mit dem Wert 0x0A enthalten ist, wandelt print das unter Windoze um in 0x0A + 0x0D - mit der Folge, daß natürlich die CRC-Checksumme nicht mehr stimmt. Gibt es in Perl noch eine andere Möglichkeit als print, um binäre Daten an den Browser zu senden?

      Gruß,
      Stefan

      1. 你好 Stefan,

        (was immer auch "你好" heißt - ich hoffe, etwas Nettes *g*)

        nǐ hǎo - eine Begrüßung ;)

        Noch ein Problem ist mir untergekommen: Wenn in den ZIP-Daten ein Byte mit dem Wert 0x0A enthalten ist, wandelt print das unter Windoze um in 0x0A + 0x0D - mit der Folge, daß natürlich die CRC-Checksumme nicht mehr stimmt. Gibt es in Perl noch eine andere Möglichkeit als print, um binäre Daten an den Browser zu senden?

        perldoc -f binmode

        再见,
         克里斯蒂安

        --
        Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
        <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
        <CK1> CFLAGS="-pipe"
        <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
        http://wwwtech.de/
        1. Moin 克里斯蒂安,

          perldoc -f binmode

          Das löst leider das Problem mit der Umwandlung durch print nicht; die Daten liegen ja bereits in binärer Form vor, werden dann aber durch print bei der Ausgabe an den Browser geändert:

            
          print "Content-type: application/x-download\n";  
          print "Content-disposition: attachment; filename=bla.zip\n\n";  
          print $zipData;  
          
          

          Gruß,
          Stefan

          1. 你好 Stefan,

            Das löst leider das Problem mit der Umwandlung durch print nicht; die Daten liegen ja bereits in binärer Form vor, werden dann aber durch print bei der Ausgabe an den Browser geändert:

            Richtig, und genau das ändert binmode: binmode sorgt dafür, dass keinerlei Umwandlungen stattfinden, sondern die Daten "as-is", um es mal so auszudrücken, geschrieben werden.

              
            binmode STDOUT;  
              
            print "Content-type: application/x-download\015\012";  
            print "Content-disposition: attachment; filename=bla.zip\015\012\015\012";  
            print $zipData;  
            
            

            再见,
             克里斯蒂安

            --
            Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
            Mensch zu Mathematiker: "Ich finde Ihre Arbeit ziemlich monoton". Mathematiker: "Mag sein! Dafür ist sie aber stetig und unbeschränkt."
            http://wwwtech.de/
            1. Moin 克里斯蒂安,

              binmode STDOUT;

                
              Ah, \*das\* hatte ich noch nicht probiert... THX!  
                
              Stefan
              
      2. (was immer auch "你好" heißt - ich hoffe, etwas Nettes *g*)

        http://translate.google.com/translate_t?langpair=zh|en

        Struppi.