Lange wurde darauf gewartet. Und immer wieder fragten Leute in Foren, Gruppen etc. nach einer Möglichkeit,
einen Fortschrittsbalken eines Dateiuploads mittels PHP anzuzeigen.
Die Antwort war immer die Selbe: Das geht nicht. Das funktioniert höchstens, wenn man den Dateiupload mittels Perl/CGI realisiert.
Und wer sich davon nicht überzeugen lassen konnte, der beschrieb eine Möglichkeit, die sich logisch anhörte und bei der jeder meinte, das könnte funktionieren.
Man könne doch, per Ajax oder auch in einem extra Frame einfach mit der Funktion stat() auf die Temp-Datei zugreifen, die während dem Upload angezeigt wird und deren Größe abfragen.
Wer es dann ausprobiert hat, hat schnell gemerkt, dass es sich logisch anhört, aber nicht funktioniert.
PHP erlaubt den Zugriff auf diese tmp-Datei nicht. Auch wenn man herausfindet, wie der Name der tmp-Datei lautet, ist ein stat() auf diese Datei nicht möglich. Es war bisher also wirklich nicht möglich.
Zwischendurch kamen dann diverse Patches, die php die Uploadmeter-Funktionalität beibringen sollten.
Ich kann zu diesen Patches, die für php < 5.2 nötig waren, nichts sagen, da ich sie nicht ausprobiert habe. Aber so oder so
patcht man sein PHP natürlich nur sehr ungerne. Von PHP-Webspace der nicht auf einem eigenen virtuellen oder dedizietren Webserver läuft einmal ganz abgesehen. Da bestand so gut wie keine Chance, wenn man nicht gerade mit dem Webhoster gut befreundet war
Ein bisschen über das, worüber ich auch schreibe gibt es hier zu sehen (incl. Patches-Version): http://bluga.net/projects/uploadProgressMeter/
Erleichterung brachte dann eine Meldung zu PHP 5.2. Es war wohl ein Changelog-Eintrag, der darauf hinwies, dass die Realisierung eines PHP-Upload-Meters
nun möglich sei.
Das ist auch so richtig. Allerdings scheint es nicht so simpel zu sein, wie man es von PHP kennt.
Der erste Gedanke: Bei www.php.net nach Dateiupload suchen und dann wird schon eine Funktion verlinkt sein, mit der man einfach den Fortschritt des Uploads abfragen kann.
Negativ. Dokumentiert wurde zu dieser PHP 5.2 Neuerung bislang nur wenig. (Oder sehr versteckt?)
Und eine Funktion, die dies “einfach” erledigt, sucht man leider auch vergeblich.
Nach einer Google-Recherche stößt man allerdings auf verschiedene Lösungen, die dann tatsächlich – mal mehr, mal weniger einfach zu benutzen sind.
Ich möchte nochmal ein bisschen auf diese Lösungen eingehen und mir bekannte Schwierigkeiten und Probleme niederschreiben.
Einfach nur mit PHP 5.2, ohne weiteres Zutun ist es aber, soweit mir bekannt, nach wie vor nicht möglich, ein PHP-Uload-Meter zu realisieren.
Eine Möglichkeit: Mit dem PECL-Modul uploadprogress
Das ist die Lösung, für die ich mich letztendlich entschieden habe und die ich vorerst beschreiben werde.
Vorgehen:
PECL-Modul herunterladen und installieren.
Auf einem Linux-System:
pecl install uploadprogress-beta
oder
cd /usr/local/src wget http://pecl.php.net/get/uploadprogress-0.3.0.tgz tar xvzf uploadprogress-0.3.0.tgz cd uploadprogress-0.3.0 phpize ./configure make make test make install
Es wird angezeigt, wo die Extension installiert wurde.
Meist etwas in der Art wie
/PATH/TO/PHP/lib/php/extensions/no-debug-non-zts-20060613/uploadprogress.so
An der Stelle ist mir nicht ganz klar, wie der eigentliche Weg gedacht ist, diese einzubinden.
Entweder man geht in das Verzeichnis
/PATH/TO/PHP/lib/php/extensions/
und legt einen Link auf no-debug-non-zts-20060613/uploadprogress.so
ln -s no-debug-non-zts-20060613/uploadprogress.so
oder man passt den Parameter extension_dir direkt auf /PATH/TO/PHP/lib/php/extensions/no-debug-non-zts-20060613 an:
extension_dir = "/PATH/TO/PHP/lib/php/extensions/no-debug-non-zts-20060613"
Sodann sucht man in der php.ini die Stelle, an der die Extensione eingebunden werden und fügt folgende Zeile dazu:
extension=uploadprogress.so
Nun den Webserver neu starten und am besten eine Datei info.php mit folgendem Inhalt bereit haben:
Beim Aufruf der der Datei sollte ein Eintrag für das Modul uploadprogress erscheinen und
uploadprogress support enabled dort stehen.
Damit sollte PHP bereits in der Lage sein, den Fortschritt des Upload-Prozesses anzuzeigen.
Nun gibt es eine Lösung von bluga.net.
Eine Demo gibt es unter http://bluga.net/projects/uploadProgressMeter/
Den Code für die Lösung gibt es per SVN unter http://svn.bluga.net/HTML_AJAX/UploadProgressMeter/trunk/
Das kann man benutzen und den Code auch nehmen, um es zu verstehen.
Ich habe jetzt noch eine ganz schnelle Lösung zusammengeschrieben, die auch auf einfache weise zeigt, wie die Statusanzeige funktionieren kann.
Es wird beim Abschicken des File-Formulars einfach ein neues Fenster geöffnet, das die Statusanzeige anzeigt.
Ist der Download fertig, schließt sich das Statusfenster wieder.
Bei großen Dateien (>8MB) werden keine Statuswerte angezeigt. Ich werde noch rausfinden, woran das genau liegt.
Demo: http://www.suchtwolke.de/php-upload-meter/pecl-uploadprogress/
Download:
http://www.suchtwolke.de/php-upload-meter/pecl-uploadprogress/pecl-uploadprogress.rar
http://www.suchtwolke.de/php-upload-meter/pecl-uploadprogress/pecl-uploadprogress.zip
http://www.suchtwolke.de/php-upload-meter/pecl-uploadprogress/pecl-uploadprogress.tar.gz
Probleme die aufgetreten sind:
Sollte auf dem Webserver mod_sec installiert sein, wird die Statusanzeige höchstwahrscheinlich nicht funktionieren.
Das bereitete mir einiges Kopfzerbrechen.
Ich dachte, dass die mod_sec-Filter mittels “SecFilterInheritance Off” in der Apache-Config ausgeschaltet wären. Jedoch reichte das nicht aus.
Abhilfe schaffte nur ein weiterer Eintrag: “SecFilterEngine Off”.








18 Kommentare
Ich vermute mal, dass der Status von Datein > 8MB nicht angezeigt wird, da durch PHP eine Limitierung für Uploads existiert
Stichwort upload_max_filesize und post_max_size.
Gruß
Dave
Richtig, nachdem ich die hochgesetzt hatte, het es auch mit größeren Dateien funktioniert.
Ich werde es im Artikel bei Gelegenheit nochmal nachtragen
Ich bekomme beim Versuch, uploadprogress zu installieren, immer ein ‘phize failed’. Wenn ich die Installation manuell durchgehe, haut er mir ein ‘-bash: phpize: command not found’ um die Ohren. Wie läßt sich das beheben, bzw. wie komme ich an phpize?
@Martin: phpize ist eigentlich Bestandteil von php. Bei meiner selber kompilierten php-Version wurde es mit installiert.
Bei mir, –prefix=/opt/php5 befindet es sich unter /opt/php5/bin/phpize
Evtl. kannst Du mit “whereis phpize” oder “locate phpize” suchen wo das Programm liegt.
Wenn Du es gefunden hast, entweder dieses benutzen (wie oben beschrieben bevor Du make ausführst, es in dem Source-Verzeichnis ausführen. Bei mir z.B. unter /usr/local/src/uploadprogress/ # /opt/php5/bin/phpize)
Oder Du setzt einen Symbolischen Link von einem bin-Verzeichnis dahin:
ln -s /opt/php5/bin/phpize /usr/local/bin/phpize
Danke!
Das Problem hat sich gelöst, nachdem ich das php5-dev-Paket installiert habe, vorher war es nicht vorhanden.
da ich aufgrund eines umstands php4 auch noch drauf habe, musste ich uploadprogress manuell installieren. aber beim letzten schritt: make install kommt folgende fehlermeldung:
http://rafb.net/p/QydKQW47.html
weiß jemand rat?
Puh, das sieht ja unübersichtlich aus – hatte zuerst sogar Angst es anzuklicken
Kannst es auch gerne hier direkt posten, wenn man dann mehr erkennt…
Eine Idee wäre aber, dass Dein php (wenn es ein 4er ist) mit der richtigen Version gepatcht werden muss, damit uploadprogress kompiliert werden kann. Schau mal hier: http://pdoru.from.ro/ da steht etwas von patches für PHP
danke, hat sich erledigt, php5-dev hat gefehlt, tut mir leid
Ich verstehe noch nicht, wie man die extension einbindet?
Ich benutzt Debian 4.0.
Hallo zusammen.
Das liest sich ja alles ganz prima. Danke schon mal für die gute Erklärung der Funktionsweise. Die Installation der Extension hat bei mir prima geklappt, allerdings mag mir uploadprogress_get_info() keine Daten zurückgeben. Ich habe alle wesentlichen Parameter der php.ini schon überprüft und testweise auch mal auf exorbitant hohe Werte gesetzt – ohne Erfolg. Hat jemand irgendeine Idee, was da falsch laufen könnte?
Hallo,
hoffe mir kann hier jemand helfen. Habe die Extension wie beschrieben implementiert – phpinfo zeigt mir auch an das die extension geladen ist und soweit auf funktionstüchtig ist.
Mein Problem:
Tests mit den Dateien von Wolke funktionieren nicht -> das array bleibt leer, es kommen also keine Daten vom Server zurück.
Da es auch keine richtige Dokumentation gibt kann man nicht nachvollziehen wie die Daten ausgelesen werden sollen, Schreibweise etc.
Die Testdateien von Bluga.net habe ich mir gesparrt, da ich html_ajax nicht installieren möchte…
Umgebung:
Apache 2 + PHP 5.2.5 + Suhosin Patch 0.9.6.2
bin für jeden Hinweis dankbar..
Hi,
ich bin mir unsicher, denke aber, dass es auch mit suhosin funktionieren müsste. Aber wenn Du die Möglichkeit hast, schalte es doch einmal ab und schau ob dann etwas kommt.
Ansonsten müsstest Du noch ein paar Infos posten… Zum Beispiel: Wie groß ist die Datei die Du hochladen willst? Ggf. zu groß oder zu klein? Wenn zu klein, bekommst Du die Infos nicht mit. Sobald hochgeladen wurde, ist das array wieder leer. Ist die Datei größer als upload_max_filesize oder post_max_size, wird auch nichts angezeigt.
Wenn es davon nichts ist, evtl. mal die entsprechenden Einstellungen aus der php.ini von suhosin posten..?
also laut einem anderen blog sind suhosin und uploadpress inkompatibel, man sollte suhosin deaktivieren.
dies versuche ich schon den ganzen morgen. habe die .so aus dem extensiondir entfernt sowie den aufruf in der suhosin.ini. nach reboot ist suhosin noch immer aktiv
Puh…ich werde nächste Woche auf jeden Fall nochmal checken, wie man suhosin so konfiguriert, dass es geht, oder für ein entsprechenden Verzeichnis ausschalten kann. Dass es aber bei Dir garnicht auszuschalten ist, ist merkwürdig. Bist Du sicher, dass Du die richtige php.ini bearbeitet hast? In der php.ini steht ja oben, welche benutzt wird.
Alternativ kannst Du in der php.ini noch eintragen (unter der suhosin-include)
suhosin.simulation=On
Damit suhosin zwar Prüfungen vornimmt, aber nichts blockt. Vielleicht bringt es ja schon etwas.
also, mein system: suse 10.1+apache 2, php5.2.5 + zend + suhosin / plesk 8.3
ich hatte die tage von diesem simulationsmodus gelesen und dachte ich probier das auch mal. bin dann natürlich erstmal an dem plesk-kram verzweifelt – welche ini is nun die richtige ? egal, ich habe diesen eintrag in allen inis eingepflegt -> resultat= 0!
meiner meinung nach sollte die php.ini auch diesen eintrag kommentieren (suhosin.simulation=on), aber dem ist nicht so.
über vhost.conf hab ich es auch probiert -> wieder nüx
ich habe aber erfahren das das php das auf diesen server läuft das suhosin einkompiliert hat, nun dachte ich mir – okay, kompilieren wir es einfach neu (die conf der installierten version zeigt dies auch an), jedoch ist dies wirklich der letzte schritt da dies nicht mein server ist und dieser auch auf keinen fall offline gehen darf.
ps: selbst eine deinstallation über yast brachte null erfolg
beim Versuch uploadprogress zu installieren geht bis ./configure alles glatt
danach make kommen div. Fehler
/usr/local/src/uploadprogress-0.3.0/uploadprogress.c:126: error: ‘MULTIPART_EVENT_FILE_END’ undeclared (first use in this function)
/usr/local/src/uploadprogress-0.3.0/uploadprogress.c:127: error: ‘multipart_event_file_end’ undeclared (first use in this function)
/usr/local/src/uploadprogress-0.3.0/uploadprogress.c:129: error: expected expression before ‘)’ token
/usr/local/src/uploadprogress-0.3.0/uploadprogress.c:133: error: ‘MULTIPART_EVENT_END’ undeclared (first use in this function)
make: *** [uploadprogress.lo] Fehler 1
kann mir jemand helfen
Danke Raymond
Hi liebe Leute!
! Nun habe ich meine Freunde in drupal.org um eine lösung gebete, doch leider erfolglos. Wenn jemand von Euch drupal kennt (ich benutze 6.11), das wäre echt so cool, wenn es da eine Lösung dafür gäbe!
Seit einigen Tagen schon kämpfe ich ganz hart mit der Installation von “pecl uploadprogress”. Gleich zum Anfang sei bemerkt, dass ich winXP OS verwende. Habe heute nun durch reinen Zufall diese Webseite gefunden und war echt begeistert von der einfachen Schrittweisen Erklärung – echt super job! Dennoch habe ich eine klitzekleine Frage (mag sich vielleicht doch etwas dumm anhören :-S):
Ich benutze Drupal für meine webseite. Der von Wolke beschriebene Path (/PATH/TO/PHP/lib/php/extensions) ist daher nicht verfügbar. Der von Drupal angegebene path lautet: /www/modules/path. So habe ich dies in dem vorhandenen path installiert und nach php.ini – modifizierung nochmal alles neu krachen lassen; aber leider ohne Ergebnis
Hallo Sven,
aber Drupal ist doch so eine Art CMS, oder? Hat das was mit der PHP-Installation zu tun?
Aber der Path zu den Extensions kann sich natürlich unterscheiden. Ich kann Dir nicht direkt weiterhelfen. Aber eine Möglichkeit ist immer, die Logdateien (von Apache und/oder PHP) anzusehen. Wird dort versucht (vielleicht vergeblich) die uploadprogressmeter-Extension zu laden?
Falls die Extension gelaen wird, was sagt denn der Aufruf von phpinfo() ?
Normalerweise sollte dort schonmal uploadprogress vermerkt sein, wenn die Extension richtig gelaen wurde. Wenn das so ist, muss man mal weitersehen, wo es hängt.
1 Trackback
[...] über PHP etwas wissen möchte, gehe ich hier nochmal ergänzend zu den Erklärungen in dem Artikel über die Installation und Benutzung zur Fortschrittsbalkenanzeige [...]