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.
php
upload
progress-bar
Josh Curren
quelle
quelle
Antworten:
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 erfordert weder APC noch andere externe PHP-Bibliotheken, ich kann Feedback zum Dateifortschritt auf einem gemeinsam genutzten Host erhalten und es wird behauptet, HTML5-Drag & Drop (persönlich nicht getestet) und mehrere Datei-Uploads zu unterstützen.
quelle
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 dafür mit YUI (oh, und hier ist die PHP-Quelle ).
Siehe die Dokumentation hier .
quelle
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 einen Flash-Uploader.
AFAIK Dies liegt daran, dass Ihr Skript erst ausgeführt wird, wenn alle Superglobalen ausgefüllt sind, einschließlich $ _FILES. Wenn Ihr PHP-Skript aufgerufen wird, ist die Datei vollständig hochgeladen.
EDIT: Dies ist nicht mehr wahr. Es war im Jahr 2010.
quelle
Ein PHP-ish (5.2+) & No-Flash-Weg, der für mich gut funktioniert hat:
In diesem Beitrag wird zunächst erläutert, wie Sie die Erweiterung "uploadprogress" zum Laufen bringen.
Erstellen Sie dann auf der Seite mit dem Formular, von dem Sie Dateien 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 von 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 sich jede Sekunde selbst aktualisiert. Sie können hier sicherlich einen schönen visuellen 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 des Uploads und beendet seine sichtbare Lebensdauer, sobald das Formular gesendet und der Browser auf die nächste Seite neu geladen wird.
quelle
Die Implementierung des Upload-Fortschrittsbalkens ist einfach und erfordert keine zusätzliche PHP-Erweiterung, JavaScript oder Flash. Aber Sie müssen PHP 5.4 und höher .
Sie müssen das Sammeln der Upload-Fortschrittsinformationen aktivieren, indem Sie die Direktive
session.upload_progress.enabled
aufOn
in setzenphp.ini
.Fügen Sie dann dem HTML-Upload-Formular unmittelbar vor allen anderen Dateieingaben eine versteckte Eingabe hinzu . Das HTML-Attribut
name
dieser versteckten Eingabe sollte mit dem Wert der Direktivesession.upload_progress.name
vonphp.ini
(eventuell vorangestelltsession.upload_progress.prefix
) identisch sein . Dasvalue
Attribut liegt bei Ihnen, es 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
$_SESSION
superglobalen Struktur erstellen, der mit den Upload-Statusinformationen gefüllt wird. Der Schlüssel ist verkettetname
undvalue
von der verborgenen 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 ähnlich aus wie folgt:
$_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 erforderlich sind. Sie haben die Informationen, wenn der Upload noch ausgeführt wird, die Informationen darüber, wie viele Bytes insgesamt übertragen werden sollen und wie viele Bytes bereits übertragen wurden.
Um dem Benutzer den Upload-Fortschritt zu präsentieren, schreiben Sie ein anderes PHP-Skript als das Upload-Skript, das nur die Upload-Informationen in der Sitzung betrachtet und sie beispielsweise im JSON-Format zurückgibt. Dieses Skript kann regelmäßig, beispielsweise jede Sekunde, mithilfe von AJAX und Informationen, die dem Benutzer angezeigt werden, aufgerufen werden.
Sie sind sogar in der Lage , den Upload abbrechen , indem Sie die Einstellung
$_SESSION[$key]['cancel_upload']
auftrue
.Detaillierte Informationen, zusätzliche Einstellungen und Benutzerkommentare finden Sie im PHP-Handbuch .
quelle
Ein weiterer Uploader voll JS: http://developers.sirika.com/mfu/
habe Spaß
quelle
In HTML5 wurde eine Datei-Upload-API eingeführt , mit der Sie den Fortschritt von Datei-Uploads überwachen können. Für ältere Browser gibt es jedoch ein Framework, das speziell zum Überwachen von Datei-Uploads und zum Bereitstellen von Informationen über diese entwickelt wurde. Außerdem verfügt es über zahlreiche Rückrufe, sodass es in allen Browsern funktioniert
quelle
Gears und HTML5 haben ein Fortschrittsereignis im
HttpRequest
Objekt 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:
Technisch gesehen 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 Blöcke aufzuteilen und jeden Block einzeln hochzuladen. Nach Abschluss jedes Blocks können Sie den Fortschrittsstatus aktualisieren.
quelle
Sie müssten Javascript verwenden, um einen Fortschrittsbalken zu erstellen. Eine einfache Google-Suche führte mich zu diesem Artikel: WebAppers Simple Javascript Progress Bar mit CSS .
Das Fortschrittsbalken-Widget zum Hochladen von Dojo-Dateien ist eine weitere Option, die das Dojo-Javascript-Framework verwendet.
BEARBEITEN: Angenommen, Sie laden eine große Anzahl von Bildern (z. B. ein Fotoalbum) hoch und veröffentlichen sie in Ihrem PHP-Skript. Sie können Javascript verwenden, um die Ergebnisse aus dem Beitrag zurückzulesen und den Fortschrittsbalken basierend auf der Anzahl der hochgeladenen Bilder zu aktualisieren / Gesamtzahl der Bilder. Dies hat den Nebeneffekt, dass die Aktualisierung erst nach Abschluss jedes Beitrags erfolgt. Schauen Sie sich hier für ein paar Informationen über den Umgang mit JS posten.
quelle
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 nachsehen kann, wie viel von der Datei hochgeladen wurde. Dieser versteckte Iframe kann jedoch von einigen Browser-Addons blockiert werden, da versteckte Iframes häufig verwendet werden, um schädliche Daten an einen Benutzercomputer zu senden.
Am besten verwenden Sie eine Art Flash-Fortschrittsbalken, wenn Sie keine Kontrolle über Ihren Server haben.
quelle