PHP - Fortschritsanzeige beim Upload

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

PHP - Fortschritsanzeige beim Upload

Beitrag von Frogger »

Hi, hab wieder eine Frage zu PHP und Upload.

Ist es möglich (möglichst einfach) eine Fortschriftanzeige einzubauen?

Es soll unter den Form-Feldern angezeigt werden.

In dieser Form ungefähr:
Status: 12.86 % hochgeladen

Kann auch eine Progressbar sein. ist mir eigentlich egal :)

Hier mal der Code den ich benutze. So wie er ist, funktioniert er schon sehr gut nur vermisse ich eine Fortschrittsanzeige.

Code: Alles auswählen

<u><b>Hochladen!</b></u><br><br>

<?PHP
if(isset($_POST['send']) && $_POST['send'] == "ja")
{  
  
  $uploaddir = 'uploadfiles/';
  if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name']))
  {
    echo "Datei erfolgreich hochgeladen.<br><br>\n";
	
    echo "Downloadlink: ";	
    echo "<b>http://www.domain.de/uploadfiles/";
    print_r($_FILES['userfile']['name']);
    echo "</b><br><br>\n";

  }
  else
  {
    echo "Fehler beim Hochladen der Datei. Fehlermeldung:\n<br />";
    print_r($_FILES);
  }
}
?>

<form enctype="multipart/form-data" action="<?PHP echo $PHP_SELF; ?>" method="post">
<input type="file" name="userfile" />
<input type="hidden" name="send" value="ja" />
<input type="submit" value="Datei hochladen" />
</form>
Kann mir bitte einer helfen, der sich gut mit PHP auskennt?

evtl STARGATE? hast ja ein klasse Onlinegame geproggt :allright:
[PB4.20]
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Hm würde da eher zu JavaScript tendieren und die anzeige damit machen.

Könntest dir auch ein PHP Script machen welches den fortschrit prüft und das
dann per Ajax alle 1-2 sec refreshen schneller wäre performance technisch eher ineffizient meine meinung.
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Beitrag von Frogger »

Danke für den Tipp zu JS aber naja das will ich dan doch nicht benutzen.
Hab mich mal genauer erkundigt und tja mit PHP geht das wohl doch nicht.

Hab eigentlich gehofft das es doch eine einfache Möglichgeit gäbe das mit PHP zu machen.
Vielleicht sogar irgendwie die Datei stückweise hochladen aber hab bisher nichts derartiges im www gefunden.
[PB4.20]
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Ich denke, da ist nicht PHP das Problem, sondern der Browser. Woher soll er denn wissen, wieviel er schicken soll? Fortschrittsangaben in Webseiten eingebettet, basieren soweit ich sie kenne ausschließlich auf Flash oder vergleichbarem.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Hm würde da eher zu JavaScript tendieren und die anzeige damit machen.
Wie soll das denn bitte mit JavaScript gehen? Gar nicht. Mit JavaScript ist das letzte, was du machen kannst, die Übertragung notfalls abbrechen, aber sobald du die Daten sendest, gilt die Webseite als verlassen. In dem Fall würde der Eventhandler onUnload ausgelöst.


> Vielleicht sogar irgendwie die Datei stückweise hochladen
Wie willst du meinen Brwoser denn zwingen, ein 1 MB Bild stückchenweise hochzuladen? Ohne ActiveX Steuerelement (Browser-PlugIns) oder einem JAVA Applett wird das nicht gehen.


> Woher soll er denn wissen, wieviel er schicken soll?
Hahaha, ouuuuuh! Der Browser schickt vielleicht im Request mit, wie groß die Datei ist? Wenn du deine Zähne putzt, sagst du dann auch einfach: "Hm.. Ich putz mal drauflos, ich weiß zwar nicht, wie viel Zähne ich habe, aber egal." Stichwort: "Content-Length". Er weiß sogar, um welchen Dateityp es sich handelt ("Content-Type", "Encoding").
Der Sender weiß immer, wie viel er sendet!
In diesem speziellen Fall ist es sogar möglich, dem Brwoser vorzuschreiben, wie groß die zu sendende Datei maximal sein darf. Dazu benötigt man das MAXLENGTH-Attribut im INPUT-TAG. Eine beispielhafte Notation für eine Datei, die maximal 8 KB groß sein darf, sähe so aus:
<input type="file" name="datei" maxlength="8192">
Wobei man sich aber darüber im Klaren sein muss, dass diese Angabe cleintseitig sehr leicht ignoriert werden kann. Es bedarf also in jedem Falle einer serverseitigen Überprüfung hinsichtlich der Überschreitung dieser festgelegten Grenze.


> Fortschrittsangaben in Webseiten eingebettet, basieren soweit ich sie kenne ausschließlich auf Flash oder vergleichbarem.
Richtig. Beispielsweise fällt mir sofort der flashbasierte "Komfort-Upload" von web.de ein.


Lösung: Da die Seite/der Frame, der die Daten schickt als verlassen gilt, kann keine neue Webseite geladen werden, bis die Daten vollständig geschickt wurden.
Deshalb muss eine zweite Webseite/ein zweiter Frame her oder, was ich auch mal gesehen habe, ein Popup-Window, indem eine neue Webseite geladen wird. Diese Seite läd sich sekündlich neu, entweder durch META REFRESH oder einem JavaScript (setTimeout("location.reload();", 1000);). Diese Seite wird darüber hinaus durch ein PHP-Skript generiert, welches ja serverseitig ermittelen kann, wie viele Daten der Browser senden will und wie viel er zu dem Zeitpunkt gesendet hat.
In PHP (auch in Perl) geht das über die Umgebungsvariable CONTENT_LENGTH, die anzahl bisher gesendeter Bytes muss dann mit einer Funktion ermittelt werden, die der PB Funktion FileSize() gleicht.
Man kann den Fortschritt natürlich einfach so ins Dokument schreiben (print gesendet/total;), jedoch ist ein grafischer Fortschrittsbalken sehr simpel zu verwirklichen. Man schreibt einfach ins Dokument, dass ein Bild (IMG-Tag!) geladen werden soll. Die Höhe dieses Bildes, das ein Ladebalken ist, muss fest angegeben werden, z. B. in px (Pixel) oder cm (Zentimeter). Die Breite jedoch muss dann prozentual (%) angegeben werden! Hat man dann also 50% gesendet, erstreckt sich das Bild auf 50% der verfügbaren Breite, was im Normalfall der gesamte Browserbereich ist. DIeser Breich lässt sich beispielsweise durch eine sog. "blinde Tabelle" (Tabelle ohne Rahmen) eingrenzen. Bei der Annahme, dass das Bild mit der prozentualen Breitenangabe in einer blinden Tabelle die 300 px breit ist steckt und der Client 50% der Daten gesendet hat, wird das Bild vom Browser durch die relative (deshalb ja auch prozentuale) Breitenangabe auf 150 px gestreckt.
Das bedeutet: Die Prozentangabe, die dem benutzer in Textform ausgegeben wird, kann (als Ganzzahl der Notation "1%" ... "100%") kinderleicht als Ladebalken benutzt werden, wobei der Browser dann autmatisch das Stretching des Bilder übernimmt.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Wie soll das denn bitte mit JavaScript gehen? Gar nicht. Mit JavaScript ist das letzte, was du machen kannst, die Übertragung notfalls abbrechen, aber sobald du die Daten sendest, gilt die Webseite als verlassen. In dem Fall würde der Eventhandler onUnload ausgelöst.
AJAX ! ^_^ da kannste kontent im hintergrund refreshen ohne site neu zu laden. Und da brauchste JS zu must das ja irgentwie starten ^_^
Nen IE only beispiel dafür findest du im Code Tips&Tricks da hab ich das genutzt um nem WebGadget im laufendem Programm daten zu schicken bzw.
diese von nem port abfragen zu lassen.

Allerdings hab ich es auch noch nicht getestet wen er ne datei am hochladen
ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich sagte, es geht mit "reinem JavaScript", wie es behauptet wurde, nicht.
Habe mich grade mal kurz über AJAX schkau gemacht, kannte ich noch nicht.

Die Upload-Version, die ich mal geehen hatte, funktionierte aber so, wie ich es beschrieben hatte. Nämlich mit 2 verschiednen Seiten, sodass der Browser für beide Webseiten/Framnes unabhängig voneinander HTTP-Requests sendet und -Repsones erhält.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Das mit den 2 Seiten wäre ja mit AJAX auch so nur das der Content der 2'ten
site in den der ersten ohne Refresh mit reingehauen wird und immerschön im
hintergrund refresht und auf der ersten seite wieder aktualisiert wird.

Mal schaun vieleicht test ich nacher mal.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

> Woher soll er denn wissen, wieviel er schicken soll?
Hahaha, ouuuuuh!
Komm mal von deinem Turm runter, hey! Da werd ich wieder sauer, wenn einer sich einbildet achsoviel klüger zu sein. Wenn du mir nicht gleich Unwissenheit attestieren würdest, könnte dir auffallen, dass ich nichts anderes gemeint habe als "Wie willst du meinen Brwoser denn zwingen, ein 1 MB Bild stückchenweise hochzuladen?".
Wobei man sich aber darüber im Klaren sein muss, dass diese Angabe cleintseitig sehr leicht ignoriert werden kann. Es bedarf also in jedem Falle einer serverseitigen Überprüfung hinsichtlich der Überschreitung dieser festgelegten Grenze.
Junge, was laberst du? Das hat doch mit der Problemstellung nichts zu tun. Und Zähneputzen ist mal der beschissenste Vergleich den ich je gehört habe. Ich scheiß absolut drauf, wieviele Zähne ich jetzt gerade putze, hauptsächlich es sind alle, und im Gegensatz zum Problem hier, kann ich trotzdem recht gut einschätzen wie weit ich bin.
> Fortschrittsangaben in Webseiten eingebettet, basieren soweit ich sie kenne ausschließlich auf Flash oder vergleichbarem.
Richtig. Beispielsweise fällt mir sofort der flashbasierte "Komfort-Upload" von web.de ein.
Danke, deine Zustimmung hatte ich dringend nötig.
Die Höhe dieses Bildes, das ein Ladebalken ist, muss fest angegeben werden, z. B. in px (Pixel) oder cm (Zentimeter). Die Breite jedoch muss dann prozentual (%) angegeben werden! Hat man dann also 50% gesendet, erstreckt sich das Bild auf 50% der verfügbaren Breite, was im Normalfall der gesamte Browserbereich ist. DIeser Breich lässt sich beispielsweise durch eine sog. "blinde Tabelle" (Tabelle ohne Rahmen) eingrenzen. Bei der Annahme, dass das Bild mit der prozentualen Breitenangabe in einer blinden Tabelle die 300 px breit ist steckt und der Client 50% der Daten gesendet hat, wird das Bild vom Browser durch die relative (deshalb ja auch prozentuale) Breitenangabe auf 150 px gestreckt.
Das bedeutet: Die Prozentangabe, die dem benutzer in Textform ausgegeben wird, kann (als Ganzzahl der Notation "1%" ... "100%") kinderleicht als Ladebalken benutzt werden, wobei der Browser dann autmatisch das Stretching des Bilder übernimmt.
[ironie]Der Großherr beweist seine Ahnung. Muss natürlich alles so sein, wie du es dir denkst...[/ironie]

So einfach wie du es geschrieben hast, ist die ganze Sache übrigens nicht. Man muss schließlich noch die Dateien dem Client zuordnen können und dazu eine Möglichkeit entwickeln, wie die beiden Skripte untereinander kommunizieren können. Weil aber das Skript, an das die Dateien geschickt werden meines Wissens erst ausgeführt werden, wenn alle Daten eingetroffen sind, wird sich dies relativ schwierig gestalten.

Würde mich sehr interessieren, wo du das verwirklicht gesehen hast (ich würd sogar den Popup-Blocker dafür ausschalten ^^).

AJAX ist im Grunde nichts anderes, als die Weiterentwicklung der Methode mit einem zweiten Browserfenster Daten anzufordern und diese auf das erste Fenster zu übertragen.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Komm mal von deinem Turm runter, hey!
Entschúldigung, aber das war einfach so amüsant zu lesen...

> dass ich nichts anderes gemeint habe als
Falsch. Denn warum stellst du dann die Frage "Woher soll er denn wissen, wieviel er schicken soll?"
Ich habe nur auf die WIE VIEL-Frage geantwortet.

> Junge, was laberst du? Das hat doch mit der Problemstellung nichts zu tun.
Hat es sehr wohl. Es ist ein dringender Tipp hinsichtlicher der Sicherheit seines Skriptes. Er sollte in jedem all daran denken, eine Überprüfung einzubauen, die beispielsweise das hochladen mehrerer dutzend MB verweigert. Es wurde zwar nicht danach gefragt, aber genau deshalb sagte ich es ja. Junge, das hier ist ein DISKUSSIONSFORUM, wo auch mal Dinge gesagt werden dürfen, nach denen nicht gefragt wurde. Ob sie befolgt werden, steht auf einem anderen Blatt.

> Und Zähneputzen ist mal der beschissenste Vergleich den ich je gehört habe.
Aber nur, weil mir auf die Schnelle nichts anderes einfiel. Ich gebe ja zu, dass es nicht der beste ist; er sollte auch nur nochmal unterstreichen, wa sich da gesagt habe.
bluejoke hat geschrieben:[ironie]Der Großherr beweist seine Ahnung. Muss natürlich alles so sein, wie du es dir denkst...[/ironie]
So einfach wie du es geschrieben hast, ist die ganze Sache übrigens nicht.
Du bist und bleibst ein Bild, mehr fällt mir dazu nicht ein. Da beschreibe ich ausführlichst ein Verfahren, das ich mal gesehen habe und du behauptest so einen Scheiß. Hast offenbar keine Ahnung davon.

So und jetzt sag mir mal, wo ich gesagt haben soll: "Muss so alles so sein, wie du es dir denkst". Du bist einfach nur... Ach, was kümmer ich mich darüber überhaupt noch. Der Klügere gibt nach und desahlb hör ich damit jetzt auch auf.


> eine Möglichkeit entwickeln, wie die beiden Skripte untereinander kommunizieren können
Da merkt man wieder, dass du ein Dummkopf bist. Wozu gibt es Möglichkeiten, dass Skripte untereinander kommunizieren können? Damit du sie ignorierst? Ich gebe zu, von PHP habe ich keine Ahnung, aber in Perl macht mir keiner was vor. Und da PHP durch Perl maßgeblich beeinflusst wurde, kann ich mich ziemlicher Sicherheit sagen, dass es auch in PHP Möglichkeiten gibt.
In Perl nämlich können Skripte allein schon durch Pipes kommunizieren. Ich weiß, dass du das nicht weißt, deshalb erkläre ichs dir ja auch.
Eine Reihe von Kommunikationsmöglichkeiten unter Perl kann hiereingesehen werden.

> Man muss schließlich noch die Dateien dem Client zuordnen können
Du hast eben keine Fantasie! Sonst wäre dir eingefallen, dass man in einer Datenbank oder in einer temporäreren Datei notieren könnte, welche Datei welchem Client gehört. Alles was man dazu braucht, ist die IP des Clienten. Wem absolut nichts einfällt, und ich hoffe du kannst mir geistig folgen, der speichert die eingehende Datei einfach als "84.135.92.134.dat" oder ähnlich. Ist zwar nicht das beste System, aber besser als keines.

> Würde mich sehr interessieren, wo du das verwirklicht gesehen hast
Ist schon Jahre her, aber scshließlich gibt es im Internet genug vorprogrammierte Lösungen. Wobei ich finde: Selbstgemacht ist immernoch am besten.


So. Ich weiß, dir dürfte inwzischen der Hut hochgegangen sein. Aber wenn du denkst, ich lasse mit mir so umspringen, wie du mit mir, dann hast du dich eben geirrt.
Denn, wenn ich sowas lese wie hier:
> [ironie]Der Großherr beweist seine Ahnung. Muss natürlich alles so sein, wie du es dir denkst...[/ironie]
Dann tust du mir Leid. In dem Moment machst du den Eindruck auf mich, als wärst du nur ein armer Straßenprogrammierer. Hast keine Ahnung von nix, lieferst keine eigenen Ideen, beschimpfst aber fleißig andere Leute.

Versteh mich nicht falsch, ich würde mich gern vernünftig mit dir unterhalten. Aber wenn du mich aus heiterem Himmel mit Sätzen wie dem zuletzt zitierten anmachst, seh ich rot. Deine Entscheidung, wie du mit anderen umgehen willst, aber meine Entscheidung, ob ich das mitmache :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten