Загрузка файлов через flash-объект c javascript общением

Загрузка файла в теории дело достаточно простое. Создаём форму вида

<form enctype="multipart/form-data" action="uploader.php" method="post">
<input type='file' name='uploadedfile' />
<input type='submit' />
</form>

После загрузки на серверной части можно использовать глобальную переменную $_FILES. Файл сервером перемещается во временную папку типа /var/temp/, откуда его можно передвинуть в нужную нам папку:

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
echo "The file ". basename( $_FILES['uploadedfile']['name'])." has been uploaded";
else
echo "There was an error uploading the file, please try again!";


Flash на помощь

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

Самым успешным оказалось решение связать flash и javascript, однако эта связка далеко не идеальна. В частности передача данных или вызов функций из js у flash-объектов затруднительна, хотя и решаема как через обращение к методам объекта, так и идентичным решениям с дополнительными библиотеками как например Swiff для mootools

  • SWFupload первопроходец, но оброс излишними js-объектами и мне показался сложным в установке и настройке (три раза обновлял). Ко всему прочему независит от сторонних библиотек (это и плюс и минус)
  • Fancyupload зависит от mootools и помоему тоже нагружен лишними вещами типа прогресса всей очереди
  • jqUploader почти то что мне надо, но возможности выбрать несколько файлов на это время ещё нет
  • jquery transmit увы не сработал потому что 10 версия плеера не поддерживалась

В качестве примера создания собственного решения можно посмотреть как это делает швед Henrik Sarvell в своей статье

В качестве основы работы связки javascript-actionscript необходима библиотека ExternalInterface, поставляющаяся вместе с flashplayer начиная с 8 версии. До этого flash не поддерживал вызов методов, а только передачу переменных, поэтому приходилось извращаться создавая прослушку изменения ключевых переменных.

Прочие попытки

Из неудачных решений можно выделить:

  • Ajax+Perl при загрузке пингует периодически perl скрипт, который проверяет размер загружаемого файла. PHP увы не в состоянии проверять размер закачиваемых в tmp-каталог файлов
  • Iframe+JS увы хотя и прост в установке в действительности не показывает прогресс загрузки.
  • Ajax+Mozilla метод прост - javascript не может сам читать файл с диска? Так разрешите! Минус - не универсален и требует вмешательства пользователя.
  • CakeTimer с iframe повязан и в основном ориентирован на CakePHP framework
  • Java applet тоже не решение, из-за большого времени ожидания, и необходимости в привилегиях.
  • Apache extension не решение, потому что решение зависит от доступа к изменению Apache и его настроек.
  • Apple remote scripting предлагает умно субмитить форму через спрятанную iframe
RSS