it-swarm.com.de

Upload Fortschrittsbalken in PHP

Weiß jemand, wie man einen Fortschrittsbalken für einen Upload in PHP bekommt? Ich versuche, Code für einen Fotoalbum-Uploader zu schreiben. Ich möchte, dass ein Fortschrittsbalken angezeigt wird, während die Fotos hochgeladen werden.

Ich bin ziemlich neu in PHP, also weiß ich nicht alles darüber.

79
Josh Curren

Dies ist bei weitem (nach stundenlangem googeln und ausprobieren von Skripten) der am einfachsten einzurichtende und netteste Uploader, den ich gefunden habe

https://github.com/FineUploader/fine-uploader

Es werden weder APC noch andere externe PHP Bibliotheken benötigt. Ich kann auf einem freigegebenen Host eine Rückmeldung zum Dateiverlauf erhalten und es wird behauptet, dass es Drag & Drop (persönlich ungetestet) in HTML5 und das Hochladen mehrerer Dateien unterstützt.

70
Jesse

Es tut mir leid zu sagen, dass nach meinem besten Wissen ein reiner PHP Upload-Fortschrittsbalken oder sogar ein PHP/Javascript Upload-Fortschrittsbalken aufgrund der Funktionsweise von PHP nicht möglich ist. Am besten verwenden Sie eine Art Flash-Uploader.

AFAIK Dies liegt daran, dass Ihr Skript erst ausgeführt wird, wenn alle Superglobalen, einschließlich $ _FILES, ausgefüllt sind. Wenn Ihr Skript PHP aufgerufen wird, ist die Datei vollständig hochgeladen.

EDIT: Das stimmt nicht mehr. Es war im Jahr 2010.

13
Macha

Wenn Sie APC installiert haben, verfügt es über einen Rückruf-Hook für den Upload-Fortschritt.

Rasmus Lerdorf (PHPs Schöpfer) hat ein Beispiel davon mit YUI (oh, und hier ist das PHP-Quelle ).

Siehe die Dokumentation hier .

13
Powerlord

Ein PHP-ish (5.2+) & No-Flash-Weg, der für mich gut funktioniert hat:

Lesen Sie zuerst this , wie Sie die Erweiterung "uploadprogress" zum Laufen bringen.

Erstellen Sie dann auf der Seite mit dem Formular, von dem Sie die Datei (en) hochladen, den folgenden Iframe:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

Fügen Sie als Nächstes diesen Code zu Ihrer Schaltfläche "Senden" hinzu:

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

Jetzt haben Sie einen versteckten iFrame in Ihrem Formular, der sichtbar wird und den Inhalt von uploadprogress.php anzeigt, wenn Sie auf "Senden" klicken, um das Hochladen der Dateien zu starten. $ upload_id muss mit dem Wert des ausgeblendeten Felds "UPLOAD_IDENTIFIER" in Ihrem Formular identisch sein.

Die uploadprogress.php selbst sieht ungefähr so ​​aus (korrigieren und an Ihre Bedürfnisse anpassen):

<html>
<head>
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
</head>
<body>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>
</body>
</html>

Beachten Sie, dass jede Sekunde eine Selbstaktualisierung erfolgt. Sie können hier sicherlich einige nette visuelle Fortschrittsbalken hinzufügen (wie 2 verschachtelte <div> s mit verschiedenen Farben), wenn Sie möchten. Der iFrame mit Upload-Fortschritt funktioniert natürlich nur, während der Upload ausgeführt wird, und beendet seine sichtbare Lebensdauer, sobald das Formular gesendet und der Browser auf die nächste Seite geladen wird.

8
IvarsK

Die Implementierung des Upload-Fortschrittsbalkens ist einfach und erfordert keine zusätzliche PHP -Erweiterung, JavaScript oder Flash. Aber Sie brauchen PHP 5.4 und neuer.

Sie müssen die Erfassung der Upload-Statusinformationen aktivieren, indem Sie die Direktive session.upload_progress.enabled in php.ini Auf On setzen.

Fügen Sie dann dem HTML-Upload-Formular eine ausgeblendete Eingabe hinzu, und zwar nur vor allen anderen Dateieingaben. Das HTML-Attribut name dieser ausgeblendeten Eingabe sollte mit dem Wert der Direktive session.upload_progress.name von php.ini (Eventuell vorangestellt) übereinstimmen durch session.upload_progress.prefix ). Das Attribut value liegt bei Ihnen und wird als Teil des Sitzungsschlüssels verwendet.

Das HTML-Formular könnte folgendermaßen aussehen:

<form action="upload.php" method="POST" enctype="multipart/form-data">
   <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" />
   <input type="file" name="file1" />
   <input type="submit" />
</form>

Wenn Sie dieses Formular senden, sollte PHP einen neuen Schlüssel in der superglobalen Struktur $_SESSION Erstellen, der mit den Upload-Statusinformationen gefüllt wird. Der Schlüssel ist verkettet name und value der versteckten Eingabe.

In PHP können Sie sich die ausgefüllten Upload-Informationen ansehen:

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

Die Ausgabe sieht ungefähr so ​​aus:

$_SESSION["upload_progress_myupload"] = array(
  "start_time" => 1234567890,   // The request time
  "content_length" => 57343257, // POST content length
  "bytes_processed" => 54321,   // Amount of bytes received and processed
  "done" => false,              // true when the POST handler has finished, successfully or not
  "files" => array(
    0 => array(
      "field_name" => "file1",    // Name of the <input /> field
      // The following 3 elements equals those in $_FILES
      "name" => "filename.ext",
      "tmp_name" => "/tmp/phpxxxxxx",
      "error" => 0,
      "done" => false,            // True when the POST handler has finished handling this file
      "start_time" => 1234567890, // When this file has started to be processed
      "bytes_processed" => 54321, // Number of bytes received and processed for this file
    )
  )
);

Es gibt alle Informationen, die zum Erstellen eines Fortschrittsbalkens benötigt werden - Sie haben die Information, ob der Upload noch läuft, wie viele Bytes insgesamt übertragen werden und wie viele Bytes bereits übertragen wurden.

Um dem Benutzer den Upload-Fortschritt zu präsentieren, schreiben Sie ein anderes PHP Skript als das hochladende, das beispielsweise nur die Upload-Informationen in der Sitzung betrachtet und im JSON-Format zurückgibt. Dieses Skript kann in regelmäßigen Abständen, z. B. jede Sekunde, mit AJAX und Informationen aufgerufen werden, die dem Benutzer angezeigt werden.

Sie können den Upload sogar abbrechen, indem Sie $_SESSION[$key]['cancel_upload'] Auf true setzen.

Detaillierte Informationen, zusätzliche Einstellungen und Benutzerkommentare finden Sie im PHP-Handbuch .

Ein weiterer Uploader voll JS: http://developers.sirika.com/mfu/

  • Es ist kostenlos (BSD-Lizenz)
  • Internationalisierbar
  • browserübergreifend
  • sie haben die Wahl, ob Sie APC installieren möchten oder nicht (Fortschrittsbalken unterbinden VS Fortschrittsbalken bestimmen)
  • Anpassbares Aussehen, da der Dojo-Vorlagenmechanismus verwendet wird. Sie können Ihre Klasse/IDs in den Vorlagen entsprechend Ihrer CSS hinzufügen

habe Spaß

2
Valdelievre

Ich habe gerade Mega Upload ( http://www.raditha.com/php/progress.php ) gefunden, das Perl verwendet, um den Upload durchzuführen und einen Fortschrittsbalken anzuzeigen.

2
Josh Curren

Gears und HTML5 haben ein Fortschrittsereignis im Objekt HttpRequest zum Senden eines Datei-Uploads über AJAX.

http://developer.mozilla.org/en/Using_files_from_web_applications

Ihre anderen Optionen, die bereits von anderen beantwortet wurden, sind:

  1. Flash-basierter Uploader.
  2. Java-basierter Uploader.
  3. Eine zweite comet-style Anfrage an den Webserver oder ein Skript, um die Größe der empfangenen Daten zu melden. Einige Webserver wie Lighttpd bieten Module für diesen In-Process an, um den Aufwand beim Aufrufen eines externen Skripts oder Prozesses zu verringern.

Technisch gibt es eine vierte Option, ähnlich wie beim Hochladen auf YouTube. Mit Gears oder HTML5 können Sie Blobs verwenden, um eine Datei in kleine Stücke zu teilen und jedes Stück einzeln hochzuladen. Nach Abschluss jedes Abschnitts können Sie den Fortschrittsstatus aktualisieren.

2
Steve-o

In HTML5 wurde ein Datei-Upload-API eingeführt, mit dem Sie den Fortschritt von Datei-Uploads überwachen können. In älteren Browsern gibt es jedoch Plupload ein Framework, das speziell für die Überwachung von Datei-Uploads und die Angabe von Informationen über diese entwickelt wurde . Außerdem verfügt es über zahlreiche Rückrufe, sodass es in allen Browsern verwendet werden kann

2
the master

Sie müssen Javascript verwenden, um einen Fortschrittsbalken zu erstellen. Eine einfache Google-Suche führte mich zu folgendem Artikel: WebAppers Simple Javascript Progress Bar mit CSS .

Dojo File Upload Progress Bar Widget ist eine weitere Option, die das Dojo Javascript Framework verwendet.

BEARBEITEN: Unter der Annahme, dass Sie eine große Anzahl von Bildern (z. B. ein Fotoalbum) hochladen und in Ihr PHP -Skript hochladen, können Sie die Ergebnisse mit Javascript aus dem Beitrag zurücklesen und die Fortschrittsanzeige basierend aktualisieren auf die Anzahl der hochgeladenen Bilder/Gesamtzahl der Bilder. Dies hat den Nebeneffekt, dass die Aktualisierung erst nach Abschluss jedes Posts erfolgt. Lesen Sie hier , um Informationen zum Posten mit JS zu erhalten.

1
Joey Robert

Ein PHP/Ajax-Fortschrittsbalken kann erstellt werden. (Überprüfen Sie die Html_Ajax-Bibliothek in Birne). Dies erfordert jedoch die Installation eines benutzerdefinierten Moduls in PHP.

Andere Methoden erfordern die Verwendung eines Iframes, über den PHP nachschaut, wie viel von der Datei hochgeladen wurde. Dieser verborgene Iframe kann jedoch von einigen Browser-Addons blockiert werden, da verborgene Iframes häufig verwendet werden, um schädliche Daten an den Computer eines Benutzers zu senden.

Verwenden Sie am besten eine Art Flash-Fortschrittsbalken, wenn Sie nicht die Kontrolle über Ihren Server haben.

1
Ali Lown

flash-Upload erledigt den Job. Die Datei wird dort hochgeladen, wo Sie möchten. Aber es gibt mehr Anforderungen als das für mich. Ich muss den Dateinamen ändern, bevor der Upload abgeschlossen ist. Dies ist auch mit der Flash-Lösung möglich, ABER NUR, wenn Sie die Variable FIXED hinzufügen. Ich muss einem Dateinamen eine Benutzer-ID hinzufügen und sehe keine Möglichkeit, dies zu tun.

0
nibuster