Wenn die session.upload_progress.enabled Ini-Option aktiviert ist, kann PHP den Upload-Fortschritt der hochgeladenen Dateien verarbeiten. Die von PHP bereitgestellten Daten sind für den eigentlichen Upload-Vorgang nicht nutzbar. Um den Status des Uploads zu verarbeiten, muss die Anwendung eine POST-Anfrage an einen separaten Endpunkt (zum Beispiel via XHR) ausführen.
Der Upload-Fortschritt steht in der Superglobalen $_SESSION zur Verfügung, wenn der Upload-Vorgang stattfindet und wenn ein POST-Feld, mit dem in der Ini-Konfiguration session.upload_progress.name hinterlegten Namen enthalten ist. Wenn PHP eine solche POST-Anfrage erkennt, wird ein Array mit Informationen in der $_SESSION hinterlegt. Die Information wird mit dem aus den Ini-Konfigurationen session.upload_progress.prefix und session.upload_progress.name zusammengesetzten Index gespeichert. Der Schlüssel wird dabei typischerweise aus den Ini-Konfigurationen zusammengesetzt, zum Beispiel:
<?php
$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>
Es ist auch möglich, den Upload-Vorgang, durch setzen des Session-Wertes
$_SESSION[$key]["cancel_upload"] auf TRUE
,
abzubrechen. Wenn mehrere Dateien in der gleichen
Anfrage übertragen werden, wird dabei nur die in der Verarbeitung befindliche Datei und
alle ausstehenden Dateien abgebrochen. Schon erfolgreich übertragene Dateien werden nicht
entfernt. Wenn ein Upload auf diese Weise abgebrochen wird, enthält der error
Schlüssel des $_FILES Array den Wert
UPLOAD_ERR_EXTENSION
.
Die Ini-Konfigurationen session.upload_progress.freq und session.upload_progress.min_freq steuern, wie häufig die Upload-Fortschrittsinformationen neu berechnet werden sollen. Mit angemessenen Einstellungen bei diesen zwei Optionen ist der Aufwand für diese Funktion sehr gering.
Beispiel #1 Beispiel-Informationen
Beispiel für den Formularaufbau des Upload-Fortschritts.
<form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" /> <input type="file" name="file1" /> <input type="file" name="file2" /> <input type="submit" /> </form>
Die gespeicherten Daten in der Session sehen wie folgt aus:
<?php
$_SESSION["upload_progress_123"] = array(
"start_time" => 1234567890, // Anfragezeitpunkt
"content_length" => 57343257, // POST Gesamtdatenmenge (in Bytes)
"bytes_processed" => 453489, // Menge der empfangenen und verabreiteten Daten (in Bytes)
"done" => false, // true wenn die POST Datenverarbeitung beendet ist (erfolgreich oder nicht)
"files" => array(
0 => array(
"field_name" => "file1", // Name des <input/> Feldes
// Die nächsten drei Elemente entsprechen den Angaben in $_FILES
"name" => "foo.avi",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => true, // true wenn die POST Datenverarbeitung dieser Datei beendet ist
"start_time" => 1234567890, // Zeitpunkt wann die Verarbeitung der Datei begonnen hat
"bytes_processed" => 57343250, // Menge der empfangenen und verabreiteten Daten dieser Datei (in Bytes)
),
// Eine weitere, noch nicht Komplett hochgeladene Datei, der selben Anfrage
1 => array(
"field_name" => "file2",
"name" => "bar.avi",
"tmp_name" => NULL,
"error" => 0,
"done" => false,
"start_time" => 1234567899,
"bytes_processed" => 54554,
),
)
);
In der Anfrage des Servers muss Pufferung deaktiviert sein, damit dies richtig funktioniert. Server wie z.B. Nginx sind bekannt dafür, große Anfragen zu puffern.