ralphi: Files zippen auf einem (unix/linux) NAS mit php/apache/mysql

Hallo Leute,
auf das der Lüfter wärend des schreibens hier durchhält ;-)

gibt es eine Möglichkeit Dateien mit php auf dem NAS (ZyXel nsa320 incl. PHP,apache,MySQL server) zu komprimieren?

Ich möchte ein Webinterface schreiben, das dem User mehrere Dateien zur Auswahl stellt - dann komprimiert werden sollen (mit dir-struktur) - dann als Zip-download
Also: Fileauswahl -> Zippen -> Downloadlink - mit php

auf dem NAS fuzt 'zip -r' nicht?! Alternativen?
Auf meinem win7 Rechner mit xampp funktioniert’s so:

<?php  
$files[] = '*.txt';         //alle txt files im verzeichnis  
$files[] = 'test.htm';         // noch eine bsp-datei  
  
$implodeFiles = implode(" ", $files); // files mit Leerzeichen zusammenbauen  
$tarName = 'backup.zip';      // Ausgangsfile definieren  
$shellBefehl = "zip -r $tarName $implodeFiles";   // Hier nutze ich ‘zip’ !!!!  
  
exec($shellBefehl,$var);      // ausführen  
print_r($var);            // kucken was er gemacht hat  
  
// hier noch den link für 'backup.zip' basteln  
?> 

Grüße aus LA (Bayern 31,6°C steigend)
ralphi

  1. Hallo,

    Ich möchte ein Webinterface schreiben, das dem User mehrere Dateien zur Auswahl stellt - dann komprimiert werden sollen (mit dir-struktur) - dann als Zip-download
    Also: Fileauswahl -> Zippen -> Downloadlink - mit php

    Es gibt eine PHP-Erweiterung, mit der Du Zip-Files verarbeiten kannst.

    Ist aber natürlich die Frage, ob Du die auf der NAS zum Laufen bekommst, aber ein Versuch wäre es wert.

    Viele Grüße,
    Jörg

    1. Ist aber natürlich die Frage, ob Du die auf der NAS zum Laufen bekommst, aber ein Versuch wäre es wert.

      standartmäßig bietet das NAS, nur von ZyXel ausgewählte Pakete. dabei ist nix mit zip und co. dabei.
      Vielleicht gäbe es eine Möglichkeit, mit dem von ein paar Crecks entworfenen bootstick 'FFP', mit dem so einiges gehen soll. Leider braucht man dazu Linuxwissen ;-(

      ralphi

      1. standartmäßig bietet das NAS, nur von ZyXel ausgewählte Pakete.

        Was ist denn daran "Stehende Kunst" (Stand-Art)? Aber da diese Schreibweise immer mehr auch in Zeitungen vorkommt ...

        Dein Problem:

        tar -czf file.tar.gz file file2 dir1 dir 2 kann auch Archive packen. Endung dann tar.gz. Die üblichen Unzipper können das auspacken.

        Jörg Reinholz

        1. standartmäßig bietet das NAS, nur von ZyXel ausgewählte Pakete.

          Was ist denn daran "Stehende Kunst" (Stand-Art)? Aber da diese Schreibweise immer mehr auch in Zeitungen vorkommt ...

          Du hast freie Auswahl.
          Mein Favorit: "eine Dampfyacht der Kaiserlich Russischen Marine, siehe Standart (Yacht)" - Mööööööööp! Mööööööööp!

          1. Om nah hoo pez nyeetz, 1UnitedPower!

            http://forum.de.selfhtml.org/archiv/2012/8/t210821/#m1438060
            http://forum.de.selfhtml.org/archiv/2011/10/t207519/#m1410367

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen chi und Chicago.

          2. Was ist denn daran "Stehende Kunst" (Stand-Art)? Aber da diese Schreibweise immer mehr auch in Zeitungen vorkommt ...

            Du hast freie Auswahl.
            Mein Favorit: "eine Dampfyacht der Kaiserlich Russischen Marine, siehe Standart (Yacht)" - Mööööööööp! Mööööööööp!

            was seit ihr den für picassos (univeralschenies;-)- in der schule, mathe, physik ne eins und deutsch auch - oder was?

            1. Om nah hoo pez nyeetz, ralphi!

              was seit ihr den für picassos (univeralschenies;-)- in der schule, mathe, physik ne eins und deutsch auch - oder was?

              seid wann?

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Rad und Radar.

              1. seid wann?

                ?

                ich möchte meine rechtschreibschwäche relativieren - ich gehörte zu den 10%, die in naturwissenschaften gut und in sprachen schlecht waren. die meisten waren in physik, mathe schlecht dafür in deutsch englisch und latein gut
                ein paar ausnahmen waren in allem gut ;-)
                war das bei dir nicht so - damals in der schule?

                1. Hallo,

                  seid wann?
                  ?

                  Zur Klärung: Ihr sei_d_ die größten Helden sei_t_ der Erfindung der Tranfunzel. ;-)

                  ich möchte meine rechtschreibschwäche relativieren - ich gehörte zu den 10%, die in naturwissenschaften gut und in sprachen schlecht waren. die meisten waren in physik, mathe schlecht dafür in deutsch englisch und latein gut
                  ein paar ausnahmen waren in allem gut ;-)
                  war das bei dir nicht so - damals in der schule?

                  Ich war in Mathe, Naturwissenschaften und Fremdsprachen ganz gut; in Deutsch auch, solange es um einfache Dinge wie Rechtschreibung, Zeichensetzung oder Grammatik ging. Ich habe mich dafür in Nebenfächern wie Geschichte, Musik, Religion, Kunst oder Sport schwer getan, und auch in Deutsch, sobald es um Aufsätze, Interpretationen und ähnliches "wachsweiches" Gedöns ging.

                  Ich bin noch mit der Maxime großgeworden, dass "korrektes Deutsch in Sprache und Schrift" zur Allgemeinbildung gehört. Und ich bedaure, dass Schwächen im Bereich von Rechtschreibung, Zeichensetzung und Grammatik heute keine Ausnahme mehr sind, sondern eher schon die Regel.

                  So long,
                   Martin

                  --
                  Ein Theoretiker ist ein Mensch, der praktisch nur denkt.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. [latex]Mae  govannen![/latex]

                    Ich bin noch mit der Maxime großgeworden, dass "korrektes Deutsch in Sprache und Schrift" zur Allgemeinbildung gehört. Und ich bedaure, dass Schwächen im Bereich von Rechtschreibung, Zeichensetzung und Grammatik heute keine Ausnahme mehr sind, sondern eher schon die Regel.

                    Es gibt keine Rechtschreibschwächen[Legasthenie ist bewußt nicht gemeint] mehr. Alles, was eine bestimmter Prozentsatz des Volkes flsach schreibt, wird entweder als alternative oder einzig richtige Schreibweise definiert [Zumindest hat man des Öfteren diesen Eindruck]

                    Stur lächeln und winken, Männer!

                    Kai

                    --
                    Array(16).join("x" - 1) + " Batman!"
                    Wir sind die Schlumpf. Widerschlumpf ist schlumpflos. Wir werden Sie einschlumpfen.
                    SelfHTML-Forum-Stylesheet
        2. klasse - das prog gibts beim NAS - ist das generell bei linux dabei? :-)

          <?php  
          exec("tar -cjf test.tar.bz2 test/");  
          ?>
          

          fuzt.

          Jörg Reinholz

          die beschribung ist sehr komplex mit wenig beispielen.

          hast du ein Bsp. für:
          mehrere einzelne Dateien (im selben Verzeichnis zb. music) -> gepackt in mehrere dirs (rock, pop etc.) in der tar datei?
          muss die datei eigentlich diese doppelendung tar.bz2  haben?

          danke
          ralphi

          1. Tach,

            klasse - das prog gibts beim NAS - ist das generell bei linux dabei? :-)

            je nachdem, wie man Linux definieren möchte: Nein, es ist nicht Teil des Kernels und der ist das einzige, das Linux heißt; ja es ist Teil der Betriebssystems GNU/Linux; ja, es ist vorgeschriebener Bestandteil der LinuxStandardBase; nein, es ist sogar bei so ziemlich jedem UNIX-ähnlichen System dabei, …

            die beschribung ist sehr komplex mit wenig beispielen.

            Es gibt sicher hunderte HowoTos für tar.

            hast du ein Bsp. für:
            mehrere einzelne Dateien (im selben Verzeichnis zb. music) -> gepackt in mehrere dirs (rock, pop etc.) in der tar datei?

            tar -cfjf test.tbz music/rock/file1 music/pop/file2 music/punk/

            muss die datei eigentlich diese doppelendung tar.bz2  haben?

            Du kannst ihr jede beliebige Ändung geben, diese spielt erstmal keinerlei Rolle, die üblicherweise verwendete Kurzvariante wäre übrigens .tbz oder .tb2

            mfg
            Woodfighter

            1. Du kannst ihr jede beliebige Ändung geben, diese spielt erstmal keinerlei Rolle, die üblicherweise verwendete Kurzvariante wäre übrigens .tbz oder .tb2

              Naja. Ich hatte tar -czf (also gzip zum Packen) und die Endung tar.gz statt bzip2 und die vorgeschlagenen Endungen vorgeschlagen, weil ggf. Windows-Anwendungen damit besser klarkommen.

              tar -czf archiv.tgz datei_1 datei_N dir_1 dir_N wäre dann also auch ein Kandidat.
              tar -cjf archiv.tb2 datei_1 datei_N dir_1 dir_N wäre dann also ein anderer Kandidat.

              Noch eine Alternative: Etwas wie

              header ('content-type: application/x-gtar-compressed'); # see /etc/mime.types  
              ...  
              passthru('tar -czO dir1 dir2 dirN file1 file2 foleN');
              

              wäre in einfachen Fällen meine Methode der Wahl, die Ausgabe erfolgt dann direkt.

              Willst Du aber die Rückgaben (Fehler?) auswerten und hast Du es mit Benutzereingaben zu tun, dann nimm ETWAS WIE:

                
              $arItems[]='/var/log/syslog'                           #Eine Datei, es können mehr sein  
              $arItems[]='/var/log/apache/'                          #Ein Verzeichnis, es können mehr sein  
                
              $itemShellEscaped='';  
              $tempfile=tempnam();                                   # temporäre Datei wird angelegt (Der  
                                                                     # zurück gegebene Name ist sicher)  
              unset ($arItems);                                      # falls nötig  
                
                
              foreach ($arItems as $item) {  
                 $itemsShellEscaped .= escapeshellarg($item).' ';    # escapeshellarg() nicht entfernen!  
                                               # Nur bei fixen Dateien, dann manuell escapen...  
              }                                # http://www.php.net/manual/de/function.escapeshellarg.php  
              $shCommand="tar -czf $tempfile $itemsShellEscaped 2>&1";  
                
              exec($shCommand, &$arReturns, &$intReturn);            # Das macht die eigentliche Arbeit...  
                
              if (! $intReturn) {  
                  header ('content-type: application/x-gtar-compressed');  
                  echo file_get_contents($tempfile);  
              } else {  
                  die ('  
              <pre>Versucht wurde: ' . $shCommand . '</br>  
              Ausgaben, Fehler:</br> . htmlentities(implode('</br>', $arReturns)) . '  
              </pre>  
              ');  
              }  
              unlink($tempfile);                                    # temporäre Datei wird gelöscht  
              unset ($returns, $err);                               # falls nötig  
              
              

              Das ist jetzt mal nicht getestet, aber es zeigt die grundlegende Vorgehensweise.

              Jörg Reinholz

              1. Tach!

                $arItems[]='/var/log/syslog'                           #Eine Datei, es können mehr sein
                $arItems[]='/var/log/apache/'                          #Ein Verzeichnis, es können mehr sein

                Semikolons, es könnten zwei mehr sein ;)

                unset ($arItems);
                foreach ($arItems as $item) {

                Wirklich unset() oder etwa reset()? Ersteres wäre kontraproduktiv, letzeres bei foreach hyperliquid.

                $itemsShellEscaped .= escapeshellarg($item).' ';    # escapeshellarg() nicht entfernen!
                                                 # Nur bei fixen Dateien, dann manuell escapen...

                Lieber escapeshellarg() lassen, das stört auch dabei nicht. Anderenfalls müsste man zum Beispiel Dateinamen mit Leerzeichen drin immer mit Backslash-Escaping statt im lesbaren Rohformat notieren und dabei auch noch das Escaping von PHP-String-Literals beachten.

                $arItems[] = '/home/reports/Report\ vom\ heutigen\ Tag.csv';

                Also zumindest bei "double quoted" String, braucht es zwei Backslashes, bei 'single quoted' reicht auch eins.

                echo file_get_contents($tempfile);

                readfile(). Liest und sendet häppchenweise und nicht den Brocken komplett in den Speicher.

                Ausgaben, Fehler:</br> . htmlentities(implode('</br>', $arReturns)) . '

                htmlspecialchars(). Oder hast du einen Grund für htmlentities(), z.B. wegen ungelöster Zeichenkodierungsprobleme? Und Implodieren mit \n, und nl2br() nach dem htmlspecialchars() anwenden.

                dedlfix.

                1. htmlspecialchars(). Oder hast du einen Grund für htmlentities(), z.B. wegen ungelöster Zeichenkodierungsprobleme?

                  Ziemlich wahrscheinlich: Ich hab keinen Zeichensatz gesendet. Also sendet der Server auch nichts - oder was dem Admin bei der Konfiguration so eingefallen ist. Und ob das mit der Konfiguration der gerufenen Shell übereinstimmt weiß der Geier...

                  Und Implodieren mit \n, und nl2br() nach dem htmlspecialchars() anwenden.

                  Oh ja! Da war definitiv ein Fehler von mir. Ich glaub aber nl2br() ist innerhalb von <pre></pre> nicht mehr nur "hyperliquid". Es sei denn natürlich, man will ganz viele Leerzeilen haben. Dann natürlich sogar nach eigenem Belieben mehrfach.

                  zu:

                    
                  
                  > > $itemsShellEscaped .= escapeshellarg($item).' ';    # escapeshellarg() nicht entfernen!  
                  > >                                 # Nur bei fixen Dateien, dann manuell escapen...  
                  > > }                               # http://www.php.net/manual/de/function.escapeshellarg.php  
                  
                  

                  Immer die ganze Geschichte erzählen, das mit der letzten Zeile hat nämlich folgende Bewandtnis:

                  Es kommt ein "Programmierer" des Weges, der sich nicht ganz perfekt auskennt...

                  nicht entfernen  ## Soso...

                  Nur bei fixen Dateien manuell escapen ## Ha! Also doch!

                  http://www.php.net/manual/de/function.escapeshellarg.php ## *Ah, da steht wohl wie es geht*

                  Browser, Copy n' Paste, "Waiting for www, summ summ" ## ... Hääää?

                  *** HAT DER EINEN AN DER WAFFEL!?! ICH LASS DAS WIE ES IST! AUS! ***

                  Jörg Reinholz

  2. Tach!

    gibt es eine Möglichkeit Dateien mit php auf dem NAS (ZyXel nsa320 incl. PHP,apache,MySQL server) zu komprimieren?

    PHP hat seit Version 5.2 (also schon ewig) eingebaute ZIP-Unterstützung, falls die zlib zur Verfügung steht. Ansonsten gibt es auch in PHP geschriebene ZIP-Funktionen - irgendwo in diesem Internet.

    dedlfix.

    1. hi,

      Tach!

      gibt es eine Möglichkeit Dateien mit php auf dem NAS (ZyXel nsa320 incl. PHP,apache,MySQL server) zu komprimieren?

      PHP hat seit Version 5.2 (also schon ewig) eingebaute ZIP-Unterstützung, falls die zlib zur Verfügung steht. Ansonsten gibt es auch in PHP geschriebene ZIP-Funktionen - irgendwo in diesem Internet.

      So kann man z.B. auch Excel-Dateien erstellen ;)
      Zudem ist das ganze auch Sicherer als "exec" und der gleichen freizugeben.
      Stell dir mal vor, dein Script hat eine Lücke und die exec führt z.b. ein "rm" aus ;)
      Die von dedlfix angesprochene Möglichkeit ist da deutlich sicherer und meiner Erfahrung nach, auch nicht soooooo extrem Langsam.

      dedlfix.

      Gruß Niklas

      --
      Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
      1. Tach!

        Stell dir mal vor, dein Script hat eine Lücke und die exec führt z.b. ein "rm" aus ;)

        Man muss sich das immer vorstellen, solange man sich nicht darum gekümmert hat. Dagegen gibt es - wie für jeden Kontextwechsel - Escaping-Mechanismen: escapeshellarg().

        dedlfix.

    2. hi

      PHP hat seit Version 5.2 (also schon ewig) eingebaute ZIP-Unterstützung, falls die zlib zur Verfügung steht.

      $zip = new ZipArchive();  
      if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {  
          exit("cannot open <$filename>\n");  
      }else{  
       echo "irgenwas gemacht?!";}  
      $zip->addFile($file);  
        
      echo "numfiles: " . $zip->numFiles . "\n";  
      echo "status:" . $zip->status . "\n";  
      $zip->close();
      

      Hab ich auch probiert. liefert eine leere seite (macht nix)
      unter winxp/7 gehts - klar!

      Ansonsten gibt es auch in PHP geschriebene ZIP-Funktionen - irgendwo in diesem Internet.

      Kuck ich mal - hast du einen link für mich?

      1. Kuck ich mal - hast du einen link für mich?

        http://www.phpconcept.net/pclzip