Implementacja paska postępu przesyłania jest łatwa i nie wymaga żadnego dodatkowego rozszerzenia PHP, JavaScript ani Flash. Ale potrzebujesz PHP 5.4 i nowszego .
Musisz włączyć zbieranie informacji o postępie przesyłania, ustawiając dyrektywę session.upload_progress.enabled
na On
in php.ini
.
Następnie dodaj ukryte dane wejściowe do formularza przesyłania HTML, tuż przed innymi danymi wejściowymi pliku. Atrybut HTML name
tego ukrytego wejścia powinien być taki sam jak wartość dyrektywy session.upload_progress.name
z php.ini
(ewentualnie poprzedzona session.upload_progress.prefix
). value
Atrybut jest do ciebie, będzie on używany jako część klucza sesji.
Formularz HTML mógłby wyglądać następująco:
<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>
Kiedy wysyłasz ten formularz, PHP powinno utworzyć nowy klucz w $_SESSION
strukturze superglobalnej, który zostanie wypełniony informacjami o statusie wysyłania. Klucz jest konkatenowany name
i zawiera value
ukryte dane wejściowe.
W PHP możesz spojrzeć na wypełnione informacje o przesyłaniu:
var_dump($_SESSION[
ini_get('session.upload_progress.prefix')
.ini_get('session.upload_progress.name')
.'_myupload'
]);
Wynik będzie wyglądał podobnie do następującego:
$_SESSION["upload_progress_myupload"] = array(
"start_time" => 1234567890,
"content_length" => 57343257,
"bytes_processed" => 54321,
"done" => false,
"files" => array(
0 => array(
"field_name" => "file1",
"name" => "filename.ext",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => false,
"start_time" => 1234567890,
"bytes_processed" => 54321,
)
)
);
Są tam wszystkie informacje potrzebne do stworzenia paska postępu - masz informacje, czy przesyłanie nadal trwa, informacje, ile bajtów zostanie przesłanych w sumie i ile bajtów zostało już przesłanych.
Aby przedstawić użytkownikowi postęp wczytywania, napisz inny skrypt PHP niż przesyłający, który będzie sprawdzał tylko informacje o wysyłaniu w sesji i zwróci je na przykład w formacie JSON. Ten skrypt może być wywoływany okresowo, na przykład co sekundę, przy użyciu AJAX i informacji prezentowanych użytkownikowi.
Jesteś nawet w stanie zrezygnować z przesyłania przez ustawienie $_SESSION[$key]['cancel_upload']
TO true
.
Szczegółowe informacje, dodatkowe ustawienia i komentarze użytkownika znajdują się w podręczniku PHP .