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.enabledna Onin php.ini.
Następnie dodaj ukryte dane wejściowe do formularza przesyłania HTML, tuż przed innymi danymi wejściowymi pliku. Atrybut HTML nametego ukrytego wejścia powinien być taki sam jak wartość dyrektywy session.upload_progress.namez php.ini(ewentualnie poprzedzona session.upload_progress.prefix). valueAtrybut 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 $_SESSIONstrukturze superglobalnej, który zostanie wypełniony informacjami o statusie wysyłania. Klucz jest konkatenowany namei zawiera valueukryte 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 .