Загрузка файла в теории дело достаточно простое. Создаём форму вида
<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