Laden Sie den Fortschrittsbalken in PHP hoch

82

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.

Josh Curren
quelle

Antworten:

70

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.

Jesse
quelle
11
Ich glaube, Sie möchten dies stattdessen verwenden: github.com/valums/file-uploader - derselbe Autor.
Michael Reed
5
Und siehe Session Upload - Fortschritt das ist , was PHP bietet Fortschritt für eine Datei-Upload aus dem Kasten heraus zu erhalten.
hakre
6
@jpeskin das ist irgendwie unfair gegenüber dem Entwickler. Nur weil Sie "anbieten, sie zu bezahlen", sind sie nicht wie eine Prostituierte verpflichtet, für Sie zu arbeiten. Wenn Sie nicht herausfinden können, wie Sie es debuggen sollen, würde ich nicht herumgehen und die Finger auf andere als Sie selbst richten - Software, die Sie im Internet finden, wird "wie sie ist" bereitgestellt nichts weiter tun als zu versuchen zu helfen.
Sucitivel
3
@sucitivel Um genauer zu sein: Ich habe angeboten zu zahlen und er hat akzeptiert, dann haben wir uns die Mühe gemacht, alle Fehler zu dokumentieren, die wir gesehen haben, und dann hat er aufgehört, auf alle E-Mails zu antworten (einfach höflich, um eine Statusaktualisierung zu bitten und ob er war immer noch an der Arbeit interessiert). Ich halte niemanden für verpflichtet, für Geld zu arbeiten. Es war lediglich ein Beobachtungsdatenpunkt für andere, die Informationen über die Verfügbarkeit und / oder das Interesse des Entwicklers an freiberuflicher Arbeit erhalten möchten. Das Projekt war gespalten, daher war ich nicht der einzige, der spürte, dass der Entwickler das Interesse an der Aufrechterhaltung verlor.
Jpeskin
5
blueimp.github.com/jQuery-File-Upload - das funktioniert wirklich gut. Zumindest gefällt es mir, da es nicht unter Ubuntu zurückbleibt =)
BeRocket
13

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 .

Powerlord
quelle
Weder die gleichen noch die PHP-Quell-Links funktionieren mehr. Haben Sie bitte einen Alt-Link?
Supersan
@supersan Diese Antwort ist sehr veraltet. APC ist tot und die Session Upload API ist jetzt eine separate Sache . Es funktioniert auch nicht, wenn der Server FastCGI verwendet ... was heutzutage aus Sicherheitsgründen am häufigsten der Fall ist.
Powerlord
13

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.

Macha
quelle
13
Warum die drei Abstimmungen? Es ist wahr und sie sind völlig ungerechtfertigt. Ich wage es, mir einen Fortschrittsbalken zu zeigen, der auf nativem PHP läuft und keine zusätzlichen Erweiterungen / Apache-Module / Perl-Skripte / andere Dinge benötigt, um zu funktionieren.
Pekka
1
Nun, es ist 2011 und jetzt ist es dank HTML5 möglich. Siehe die erste Antwort hier: stackoverflow.com/questions/76976/…
Zarel
10
Nun, es ist 2012 und das Hochladen von Dateien in HTML5 über XMLHttpRequest ist immer noch nicht in allen gängigen Browsern verfügbar.
Damien B
3
@ Pekka 웃 Es ist nicht wahr. Wenn Sie APC installiert haben (und sollten), können Sie dies vollständig nativ in PHP und auch ohne Javascript tun.
Ariel
2
@ Pekka 웃 Ganz zu schweigen vom Hochladen mit Sitzungsinformationen in PHP> = 5.4.
Wookie88
8

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.

IvarsK
quelle
Wie kann man eine Datei ohne $ _FILES in PHP hochladen
4

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.enabledauf Onin setzen php.ini.

Fügen Sie dann dem HTML-Upload-Formular unmittelbar vor allen anderen Dateieingaben eine versteckte Eingabe hinzu . Das HTML-Attribut namedieser versteckten Eingabe sollte mit dem Wert der Direktive session.upload_progress.namevon php.ini(eventuell vorangestellt session.upload_progress.prefix) identisch sein . Das valueAttribut 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 $_SESSIONsuperglobalen Struktur erstellen, der mit den Upload-Statusinformationen gefüllt wird. Der Schlüssel ist verkettet nameund valuevon 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']auf true.

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

David Ferenczy Rogožan
quelle
2

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

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

habe Spaß

Valdelievre
quelle
2

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

der Meister
quelle
2

Gears und HTML5 haben ein Fortschrittsereignis im HttpRequestObjekt 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 Anforderung im Kometenstil an den Webserver oder ein Skript, um die Größe der empfangenen Daten zu melden. Einige Webserver wie Lighttpd bieten Module für diesen Prozess an, um den Aufwand für das Aufrufen eines externen Skripts oder Prozesses zu sparen.

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.

Steve-o
quelle
1

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.

Joey Robert
quelle
6
-1 Der Javascript-Fortschrittsbalken ist nett, hat aber meines Erachtens nichts mit dem Hochladen von Dateien zu tun. Und der Fortschrittsbalken für das Hochladen des Dojo bietet keine Schnittstelle zu PHP. Korrigieren Sie mich, wenn ich mich natürlich irre.
Pekka
1

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.

Ali Lown
quelle
Einige Add-Ons blockieren möglicherweise Iframes, aber Browser? Kannst du ein Beispiel geben?
ya23
Wenn Sie die Begriffe "Ajax-PHP-Datei-Upload" googeln, werden 4 der 5 besten Ergebnisse mit iframes zurückgegeben (nicht sicher, ob dies der Fall ist (Seite wird nicht geladen)). Schauen Sie sich die Beispiele auf den einzelnen Websites an.
Ali Lown
In der Tat verwenden sie Iframes, erwähnen aber nicht, dass sie auf jeden Fall blockiert werden können. Oder habe ich das verpasst?
ya23
Tut mir leid, ich habe falsch gelesen, was Sie gefragt haben. Nein, ich kann keine Beispiele für Browser nennen, die Iframes direkt blockieren. Ich habe an die Addons gedacht, die die Leute mit ihnen verwenden, wie z. B. Noscript, das Iframes blockiert. Aktualisierter Text in der Post zur späteren Bezugnahme.
Ali Lown