Gezippte Dateien im Webspace entpacken

Montag, 14. April 2008 |  Autor:

wordpress_symbolDas hat man nun davon, wenn man allzu neun-mal-klug einen Kommentar verfasst. Im WP-Upgrade Blogbeitrag von admartinator merkte ich in einem Kommentar an, dass man die Files auch gezippt auf den Server hochladen kann.
Alles schön und gut, nur nennt nicht jeder einen VServer oder gar Rootserver sein eigen.
Die Frage von PapaNovember wie man denn hochgeladene Zip-Dateien auf einem Webserver entpackt ohne einen Shellzugang zu haben ist also mehr als berechtigt. SFTP, SCP lassen einen Remotebefehl nicht zu RSH und ähnliches wird ja wohl nicht zugelassen sein.
Da auf den meisten Webservern PHP vorhanden bietet sich dafür ein kleines PHP Script an. Es sei hier erwähnt, dass das folgende Script nichts anderes macht wie eine Variable, nämlich den Dateinamen des Archives inkl. Pfad abfrägt und dann an den Betriebssystembefehl unzip weiterleitet. Es werden keine Prüfungen gemacht ob die Zip-Datei vorhanden ist, ob das Zielverzeichnis vorhanden ist oder ob alle Rechte richtig gesetzt sind.
ABER DAS WICHTIGSTE, es wird auch keine Prüfung vorgenommen auf die Eingabefelder, das Skript ist als Ansatz gedacht. Wenn Ihr das Skript verwenden wollt um etwas auf Eurem Server zu entpacken, sichert es ab (www.php.org ist Euer Freund) oder ladet es nur temporär hoch und löscht es anschliessend wieder.

Liebe Hackerbuben und Hackermädels, versuchts erst gar nicht, das Skript ist nicht auf meinen Server abgelegt.

Danke an Nowi, der mich auf die Syntaxfehler dank des WYSIWYG-Editors (“WHAT-YOU-SEE-IS-NEVER-WHAT-YOU-GET”) aufmerksam gemacht hat.

Genug der Worte, jetzt zum Skript:

<?php
// Konstante fürs Kommando definieren
if (!defined('UNZIP')) {
   define("UNZIP", "unzip -o @ARCHIV@ -d @ZIELVERZEICHNIS@" );
}
// Formular anzeigen oder entpacken
if (isset($_POST['stage']) && ('process' == $_POST['stage'])) {
   $result=process_uncompress();
// Entpacken war erfolgreich oder nicht
   if($result===FALSE) {
     echo('No Way, nicht mit diesem Hemd'); 
   }else{ 
     echo('Alles klar, coole Sache Parker');
   }
} else {
  process_form();
}
 
// Demoformular zur Abfrage der Parameter
function process_form() {
echo <<<END
<form action="$_SERVER[PHP_SELF]" method="post">
Bitte Pfad und Namen der ZipDatei eingeben 
<input name="source" type="text" />
Bitte Pfad für das Entpacken eingeben
<input name="destination" type="text" />
<input name="stage" type="hidden" value="process" />
<input type="submit" value="Entpack mich !" />
END;
}
 
// Funktion die das Entpacken übernimmt
function process_uncompress() {
$cmd=UNZIP;
// Das Kommando mit den Formulardaten versorgen
$cmd=str_replace('@ARCHIV@',$_POST['source'],$cmd);
$cmd=str_replace('@ZIELVERZEICHNIS@',$_POST['destination'],$cmd);
// Returncode True setzen
$rc=1;
$ArrayResult=array();
// Betriebssystemaufruf zum Entpacken des Archives
$StringResult=exec($cmd,$ArrayResult,$rc);
/* Wahr oder Falsch zurückgeben, 
abhängig davon ob das entpacken erfolgreich war oder nicht. */
 
return ($rc==0);
}
?>

… und schon haben wir unsere Zip-Dateien im Zielverzeichnis entpackt und wir brauchen keine zip-extension in der php.ini .
Ob sich der Aufwand lohnt um ca. 4MB Filetransfer einzusparen bleibt dahingestellt.

Tags »   , , , , , «

Trackback: Trackback-URL | Feed zum Beitrag: RSS 2.0
Thema: Anleitung, OSX, PHP, Tipps

Diesen Beitrag kommentieren.

16 Kommentare

  1. Danke für die Anleitung ;)

  2. Ach übrigens. Dein Link-target “_new” verfehlt seine Wirkung ;)

  3. Danke, ist geändert.

  4. 4
    asaaki 

    target sollte man heutzutage doch gar nicht mehr benutzen. gilt als deprecated und darf nach xhtml gar nicht mehr verwendet werden. nur mal so anmerk*

    zum skript: für das wp-update sicherlich nicht immer zu gebrauchen, aber es ist ja ausbaufähig und für weitergehende anwendungen akzeptabel. halt eine gute skriptvorlage.
    dumm nur, wenn beim webhoster dann vielleicht auch noch unzip entweder nicht verfügbar oder erlaubt ist (kann ja sein, dass da ein riegel zur sicherheit vorgeschoben wurde, um missbrauch zu vermeiden. man kennt ja die webhoster…).
    heutige php-installationen haben aber doch meist eine erweiterung für archive drin. aber dennoch auch hierbei eine gute alternative, da es sicher ressourcen-schonender ist als die interne (ent)pack-variante. jetzt wäre es noch spannend, mit dem skript auch gleich hochzuladen ohne das phpupload zu nutzen, also auch hier wieder auf os-mittel zurückzugreifen. ist das eigentlich machbar?

  5. @asaaki ich weiss old school halt :-) Ich gelobe Besserung.

    Ein PHP Upload mit BS Mitteln ist nicht so einfach, da der Server auf den Client zugreifen müsste…. hmm interessante Aufgabe.
    Als Lösung würde mir nur der Download über Internetadresse einfallen.

    LL&P
    David

  6. 6
    asaaki 

    hm, ich weiß, schwierig zu realisieren. man müsste schließlich die formularupload via phpupload irgendwie umbiegen/überschreiben müssen.

    mein gedanke dabei war nur, wie ich größere uploads als die maximalgrenze von php lösen könnte. meistens sind die ja auf 8MB begrenzt. und da ist man ja dann entweder auf manuelles FTP beschränkt…

    oder:

    ginge eine lösung, die überprüft, wie groß die datei ist und sich dann nur häppchenweise die daten holt, quasi teilt. und das wird dann so oft durchlaufen, bis die vollständige datei aufm server ist. ich mein, wie lösen die das bei youtube und co.? haben die nur eine unendliche größe für phpupload oder wie machen die das?

  7. 7
    Gordon 

    Also als UMTS Nutzer ist das definitiv Lohnenswert. Da das Hochladen der ~4k Dateien mit einem Ping von ~300ms wirklich eine ganze Stunde dauert. Danke!

  8. 8
    Gordon 

    Dein Script ist leider ziemlich nutzlos mit den ganzen   usw zeichen drin. Habe es mal korrigiert. http://www.colz.de/temp/unpack.txt
    Geholfen hat es mir leider aber auch nicht, kommt nur die stupide Fehlermeldung.

  9. Was hast Du den für ein Problem ?

  10. 10
    Nowi 

    Hi,
    auch bei mir funktioniert das nicht. Habe eine leere Seite. Hatte mir das Script vor einiger Zeit schonmal geladen, da hab ichs zum laufen bekommen und es funktionierte bestens. Weiß aber auch nicht ob ich noch was angepasst hatte. Jetzt geht es jedenfalls nicht, :-(

  11. Hallo,
    ne weiße Seite deutet auf einen “Fatal Error” des PHP hin, kommst Du denn an Dein Error Logging dran oder schalte es doch mal ein.

    Grüße
    David

  12. 12
    Nowi 

    Hallo,
    danke für den hinweis mit den Fehlermeldungen. Waren tatsächlich abgeschaltet. Nach Einschalten kamen einige Syntaxerror zum Vorschein. Als mussten die & durch & Zeichen ersetzt werden, dann mussten die ganzen < im Formular durch die richtigen dreieckigen Klammern ersetzt werden und die drei vor dem __END ganz rausgelöscht werden. Auch das __END am Ende der Formularfunktion habe ich entfernt. Jetzt läuft es wieder prima ;-) …Müsste vielleicht mal angepasst werden.

  13. 13
    Nowi 

    Hab doch gewusst, dass da einiges verloren geht ;-) … die &-amp-; durch & Zeichen und die &-lt-; durch <

  14. Hallo Nowi,

    danke für den Hinweis, der Code ware “noch” mit dem alten Codeauszeichner Plugin eingebunden ich bau das heute in die neue Form um, dann sollte Copy+Paste auch wieder gehen.

    LL&P
    David

  15. So nun sollte das Script wieder richtig dargestellt werden

  16. 16
    Simon 

    Es ist eben doch schneller eine große Datei per FTP hochzuladen als 2160 kleine Fitzelchen – besonders im Passive Mode! Vielen Dank!

Kommentar abgeben