На самом деле - не существует никакой AJAX-загрузки файлов на сервер.
Как известно - классический способ асинхронной отправки данных на сервер - это использование объекта XmlHttpRequest. Однако, из соображений безопасности, данный объект не поддерживает никаких передач файлов на сервер, и никогда не поддерживал.
Встаёт вопрос, так как же работают сотни плагинов и велосипедов под гордым названием
AJAX Multiple File Uploader Mega Plugin with Super Progress Bar version 9000. Ведь они, падлы, реально "загружают файлы на сервер асинхронно". На самом деле - асинхронности в них принципиально - нет никакой, и всё что они делают - создают видимость асинхронности загрузки.
Так как же они создают видимость? А всё банально просто: Они используют HTML-тег <IFRAME></IFRAME>, то бишь обыкновенный фрейм, и отправляют данные самым что ни на есть - синхронным способом, только страница при этом не обновляется, а как и положено - обновляется фрейм. Такие дела. Фрейма естественно, не видно, так как он делается невидимым (style="display: none;").
Итак - мы подошли к самому интересному! К процессу создания "AJAX-загрузки" файлов! - Погнали:
Создаём файло test.php например:
В файл вписываем html-код:
CODE (
html):
скопировать код в буфер обмена
<iframe style="display: none;" id="superframe" name="superframe"></iframe>
<form method="post" enctype="multipart/form-data" action="test.php" target="superframe">
<input name="userfile" type="file"> Выбери файло
<input type="submit" value="Послать" />
</form>
Ниже вписываем php-код
PHP:
скопировать код в буфер обмена
<?PHP
//Файлы у меня валятся в папку upload в корне сайта, замените на свою.
$uploaddir = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'upload' . DIRECTORY_SEPARATOR;
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']); print "Зокачено успешно!!11";
} else {
print "EPIC FAIL";
}
?>
Итак, готово. - Выполняем скрипт, и видим собственно форму
и что самое важное - ДВА НОТИСА:
Notice: Undefined index: userfile in .....uploader.php on line 27
Notice: Undefined index: userfile in .....uploader.php on line 28
Они вылазят потому, что мы просто загрузили страничку, а суперглобальной переменной FILES у нас пока не существует.
Вы скажете "Авотщас - я зокачаю файл - и мне выползет сообщение "Закачено успешно!!11" либо "FAIL"", а ошибки пропадут.
Авотфиг! :-D
Пробуем зокачать файл, и с изумлением видим -
НОТИСЫ ОСТАЛИСЬ!! , а это значит - сама страничка
НЕ ПЕРЕЗАГРУЗИЛАСЬ, УРА!!11
Возникает вопрос, а хде собственно, сообщение об успешном зокачивании, либо фейле, и что собственно, перезагрузилось? Всё просто! Сообщения вылезли, но их не видно, так как они находятся в том самом скрытом фрейме! А перезагрузился - невидимый фрейм!
WIN!!!11 Вот так вот принципиально и работает костыль, под гордым названием "AJAX-загрузка файла".
Возникает следующий вопрос: "А в таком случае - зойчем здесь нужен Javascript???"
Всё просто:
- Он может сгенерить тот самый скрытый фрейм и форму на странице.
- Он может вывести свистелки и перделки, например картинку с прогрессбаром.
- Он может распарсить данные вернувшиеся во фрейм, и вывести их за пределами оного (Например показать те самые сообщения об успешной загрузке или фейле).
PS
Кстати говоря, данная техника вполне годна для передачи на сервер - не только файлов, но и полноценных POST-запросов. Кроме того, в отличие от того-же XmlHttpRequest - она кроссплатформенная, простая как кирпич и (что полезно) - не подпадает под так называемое "правило ограничения домена".
Ну на этом я заканчиваю. Надеюсь всем всё ясно, если неясно - отвечу на вопросы