Gezippte Dateien im Webspace entpacken
Montag, 14. April 2008 | Autor: David Krcek
Das 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.


Danke für die Anleitung
Ach übrigens. Dein Link-target “_new” verfehlt seine Wirkung
Danke, ist geändert.
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?
@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
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?
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!
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.
Was hast Du den für ein Problem ?
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,
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
Hallo,
…Müsste vielleicht mal angepasst werden.
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
Hab doch gewusst, dass da einiges verloren geht
… die &-amp-; durch & Zeichen und die &-lt-; durch <
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
So nun sollte das Script wieder richtig dargestellt werden
Es ist eben doch schneller eine große Datei per FTP hochzuladen als 2160 kleine Fitzelchen – besonders im Passive Mode! Vielen Dank!