Реализация индикатора выполнения загрузки проста и не требует никаких дополнительных расширений PHP, JavaScript или Flash. Но вам нужен PHP 5.4 и новее .
Необходимо включить сбор информации о ходе загрузки, установив директиву session.upload_progress.enabled
в On
в php.ini
.
Затем добавьте скрытый ввод в форму загрузки HTML, просто перед любым другим вводом файла. HTML-атрибут name
этого скрытого ввода должен совпадать со значением директивы session.upload_progress.name
из php.ini
(в конечном итоге ему предшествует session.upload_progress.prefix
). Атрибут value
зависит от вас, он будет использоваться как часть сеансового ключа.
Форма HTML может выглядеть так:
<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>
Когда вы отправляете эту форму, PHP должен создать новый ключ в суперглобальной структуре $_SESSION
, который будет заполнен информацией о статусе загрузки. Ключ соединяется name
и value
скрытого ввода.
В PHP вы можете просмотреть заполненную информацию о загрузке:
var_dump($_SESSION[
ini_get('session.upload_progress.prefix')
.ini_get('session.upload_progress.name')
.'_myupload'
]);
Вывод будет выглядеть примерно так:
$_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
)
)
);
Существует вся информация, необходимая для создания индикатора выполнения - у вас есть информация, если загрузка еще продолжается, информация о том, сколько байтов будет передано в общей сложности и сколько байтов уже было передано.
Чтобы представить ход загрузки пользователю, напишите другой сценарий PHP, отличный от загружаемого, который будет смотреть только информацию о загрузке в сеансе и возвращать ее в формате JSON, например. Этот сценарий может вызываться периодически, например каждую секунду, с использованием AJAX и информации, предоставляемой пользователю.
Вы даже можете отменить загрузку, установив $_SESSION[$key]['cancel_upload']
в true
.
Для получения подробной информации, дополнительных настроек и комментариев пользователя см. Руководство по PHP .