вторник, 27 ноября 2007 г.

PHP загрузчик с ProgressBar'ом

Одним из недостатков загрузки файлов через веб-интерфейс является отсутствие возможности увидеть статус процесса загрузки.

Raditha Dissanyake предлагает свой вариант решения этой проблемы -
"Mega Upload". CGI скрипты + javascript (страница загрузки: http://sourceforge.net/projects/megaupload/).

При аплоаде появляется вот такое окошко:



В есь процесс проходит такой путь:

1) Сабмит формы с файлами
2) Вызов javascript функции postIt
3) Передача управления upload - хендлэру
4) Хендлер выбирает нужный скрипт, который выполняет манипуляцию с файлами
5) Возврат в форму загрузки


Рассмотрим все этапы подробнее.

Форма загрузки должна иметь следующий вид:


<form enctype="multipart/form-data" action="/cgi-bin/upload.cgi?sid=1Kfg87r4sd5" method="post" name="uploadForm">
<input name="sessionid" value="1Kfg87r4sd5" type="hidden">
<input name="upload_single_font" value="1" type="hidden">
Файл 1: <input name="file[0]" type="file">
Файл 2: <input name="file[1]" type="file">
Файл 3: <input name="file[2]" type="file">
<input type="reset"> <input value="Загрузить" onclick="checkFields();" type="button">
</form>


Рассмотрим необходимые поля:

  • sessionid - используется для безопасности (в CGI сравнивается с параметром, переданным в адресной строке)

  • upload_single_font - название actiona, по которому в upload - хэндлере будет выбираться нужный скрипт для манипуляции с файлами


После нажатия на кнопку "Загрузить" вызывается javascript функция checkFields(). В ней можно проверить не пуста ли форма с файлами, а также здесь вызывается функция postIt() - она берет значения из формы и передает их CGI скрипту. После этого появляется окошко с ProgressBar'ом, управление передается upload - хэндлеру.
Структура хэндлера следующая:


if(isset($_REQUEST['upload_single_font']))
$upload_single_font = $_REQUEST['upload_single_font'];


// ...
// здесь могут быть проверки других actions
// ...

else if (@$upload_single_font)
{
include_once './upload_single_font.php';
exit;
}


Таким образом управление передается соответствующему скрипту (upload_single_font.php)

В скрипте для манипуляции с файлами массив файлов хранится в $file (не $_FILES !!!)

И финальный этап - редирект в изначальную форму с радостным сообщением ("Файлы успешно загрузились").

Если кто-нибудь еще знает способы реализации ProgressBar'ов - пишите в комментариях.


9 комментариев:

[YS.PRO] комментирует...

Это как и для чего? Возможно имелось ввиду progress bar средствами php?

snowcore комментирует...

Это для отображения процесса загрузки файлов на сервер. Используется CGI (+ javascript).

snowcore комментирует...

спасибо за замечание... исправил )

[YS.PRO] комментирует...

Вот это уже понятно с js).
Хотя видел одно извращение в сети, не помню уже где. Суть заключалась в том, что в цикле while(TRUE) выводилась точка, т.е. echo '.' и сразу после шел вызов функции flush() ;)

snowcore комментирует...

while(!придумали_что-нибудь)
{
юзаем ("while(true)");
}

бесконечный цикл... точно извращение!

[YS.PRO] комментирует...

Не, не так...
while(TRUE)
{
echo '.';
flush();
//...логика окончания цикла
if(надо)
break;
}

snowcore комментирует...

ys.pro, да это был прикол (типа пока что-нибудь не придумали, то делаем как попало )))

maxtrof комментирует...

Занятная статейка ;) Так же было бы очень интересно почитать про разнообразные анимации средствами php/javascript

Денис Радченко комментирует...

Можно использовать fancyupload, только оно тоже извращение еще то.