Аякс загрузка файлов
Как-то раз, давным-давно, стала передо мной задача написать загрузчик картинок без перезагрузки страницы. "Ничего сложного" - подумал я, и принялся писать. Однако, в процессе работы всё же возникли некоторые подводные камни. Вот об этом я и хочу поговорить
Прежде всего, нужно выбрать принцип. Скажу сразу по секрету, что загружать файлы с помощью AJAX нельзя, зато есть обходной путь. Придуман он не мной, это общеизвестный метод. Итак, нам понадобится: форма загрузки, файл обработки загрузки, 1 фрейм(!).
Как это действует: в форме указан параметр target на фрейм, который можно разместить где-нибудь внизу страницы, а чтобы он не мозолил глаза - прописать ему стиль display: none;
Обработчик формы (параметр action) - скрипт, который, собственно, и выполняет загрузку файла (точней, обработку загрузки), и обязательно выводит код JavaScript, который сообщит о результате загрузки (в случае успеха - выведет изображение, в случае неудачи - описание ошибки)
Итак, код с комментариями:
Файл с формой:
<table> <form enctype="multipart/form-data" target="fileuploadhidden" action="upload.php" method="POST"> <!--в атрибуте target указываем наш фрейм (он ниже), в атрибуте action - имя файла-обработчика--> <tr> <td>Upload image:</td> <td> <input type="file" name="imgfile" /> <input type="submit" name="submit" value="Загрузить" /> </td> <td align="left"> </td> </tr> <tr> <td> </td> <td colspan="2"><div id="image"></div></td> </tr> </form> <!--Обратите внимание, если на странице должны вводиться ещё какие-либо данные,
то для них нужно сделать отдельную форму, не писать всё в эту форму--> </table> <iframe name="fileuploadhidden" id="fileuploadhidden" style="display: none;"></iframe>
Теперь, собственно, файл-обработчик (upload.php):
$response = '';
//если файл загрузился без ошибки
if ($_FILES['imgfile']['error']==0){
//и тип файла - изображение
if (($_FILES['imgfile']['type']=='image/png')||(($_FILES['imgfile']['type']=='image/jpeg'))||($_FILES['imgfile']['type']=='image/gif')){
//указываем папку загрузки и даём файлу новое имя (хэш из текущего времени с оригинальным именем файла)
$filename = 'images/uploads/'.md5(time().$_FILES['imgfile']['name']).'.jpg';
//копируем с проверкой
if (copy($_FILES['imgfile']['tmp_name'], $filename)){
//если скопировалось - заносим в переменную тег изображения (это уже на ваше усмотрение - можете просто сообщение вывести)
$response = '<img src="'.$filename.'" />';
}else{
//если файл не скопировался...
$response = '<span style="color:red;">Невозможно скопировать файл! Проверьте доступ на запись к папке!</span>';
}
}else{
//если файл не картинка...
$response = '<span style="color:red;">Некорректный тип файла! Используйте PNG, JPEG или GIF</span>';
}
}else{
//если файл не загрузился на сервер
$response = '<span style="color:red;">Невозможно загрузить файл! Возможно, превышен максимальный размер файла</span>';
}
//вывод. Выводим Javascript
echo '<script language="JavaScript">';
//в родительском документе ищем элемент с айдишником image и вписываем в него результат действий нашего скрипта
echo 'window.parent.document.getElementById("image").innerHTML = "'.$response.'"';
echo '</script>';
?>
Предыдущая статья: PHP sendmail: отправка почты с вложениями посредством PHP Следующая статья: Работа с архивами на php: ZipArchive







Комментарии:
| Следующая страница »
VLOmper 25.01.2011 02:44
Это интересно, а как бы поставить прогресс бар? Ну ясно что это очень сложно, а хотя бы просто gif картинку обозначающую что идет загрузка? Спасибо.
Stas 15.02.2011 00:46
Я предпологаю , что картинку загрузки можно поставить как то так , ну img поправишь.. <form enctype="multipart/form-data" target="fileuploadhidden" action="upload.php" method="POST" onSubmit="document.getElementById('image').innerHTML='<img src=download.gif>'">
stas 15.02.2011 00:47
А не тут в коментах не оставить
Rudik 20.03.2011 23:55
А я сам до такого метода додумался :Р
ogibin90 09.04.2011 21:07
А с помощью ajax знает кто как файл закинуть? каким методом файл передавать
Михаил 10.04.2011 12:16
Статья помогла, но при реализации нашел пару ошибок в коде: 1) тег table не закрыт. 2) в php коде в строке <<>> проблема с кавычками (вложенные такие же как внешние)
Не смотря на недочеты, автору респект и благодарность.
Михаил 10.04.2011 12:16
код удалился из сообщения --- строка 3 снизу.
koz1024 21.04.2011 06:05
Михаил, спасибо, исправил
Виталя 17.11.2011 08:33
Познакомься с PLUPLOAD - полезно будет
koz1024 17.11.2011 09:56
Виталя, естественно есть куча готовых решений... Идея в том, чтобы понять разобраться как оно работает внутри, и изобрести свой велосипед.
Естественно, в проектах лучше использовать что-то готовое и отлаженное
Комментарии:
| Следующая страница »