Форма загрузки файлов на сервер с помощью php
Ни для кого не секрет, что иногда нужно загружать файлы на сервер . Ничего сложного в этом нет, однако есть пара мелочей, связанных с защитой, о которых не стоит забывать.
Обработчиком формы загрузки файлов будет PHP.

HTML-код:
<form method="post" enctype="multipart/form-data"> <p>Загрузить файл:</p> <p><input name="file" size="18" type="file" value=""></p> <p><input name="submit" type="submit" value="Загрузить"></p> </form>
Код тривиально простой. Главное не забывать про указание enctype, потому что, как правило, из-за него и возникают проблемы. Второе, на что обращаю внимание, так это на то, что не прописан в форме action, то есть подразумевается, что html-код и php-код будут в одном файле. Всё что касается html-кода форм можно прочитать в статье - Форма обратной связи на PHP.
PHP-код:
<?php $file = $_FILES['file']['tmp_name']; $filename = $_FILES['file']['name']; if(!empty($file)) { ini_set('memory_limit', '32M'); $maxsize = "100000000"; $extentions = array( "gif","txt","tpl","jpg","jpeg","png","zip", "rar","7z","tif","psd","swf","flv","avi","mpeg","mp4","mp3","wav", "ogg","ogm","doc","xls","ppt"); $size = filesize ($_FILES['file']['tmp_name']); $type = strtolower(substr($filename, 1+strrpos($filename,"."))); $new_name = 'file-'.time().'.'.$type; if($size > $maxsize) { echo "Файл больше 100 мб. Уменьшите размер вашего файла или загрузите другой. <br><a href='' onClick=window.close();>Закрыть окно</a>"; } elseif(!in_array($type,$extentions)) { echo ' <b>Файл имеет недопустимое расширение</b>. Допустимыми являются форматы изображений, видеофайлов, флэш-роликов и текстовых документов. <br>'; } else { if (copy($file, "uploads/".$new_name)) echo "Файл загружен!<br>Скопируйте адрес файла<br> <a href=\"uploads/$new_name\"><b>http://site.com/uploads/$new_name</b></a><br> и нажмите<br><a href='' onClick=history.back();>Вернуться назад</a>"; else echo "Файл НЕ был загружен."; } } ?>
1 Строка 2. В переменную файл $file заключается имя временного файла, в который сохраняется загруженный файл.
2 Строка 3. В переменную $filename заключается исходное имя файла.
3 Строка 4. Проверка - если файл загружался, то будет выполнен весь ниженаписанный код.
4 Строка 6. Выделяем на процесс больше опертивки, потому что при загрузке больших файлов умолчаний может быть недостаточно. 32 метров должно хватить, если что, ставьте 64.
5 Строка 7. Максимальный размер файла в байтах в переменной $maxsize. Сейчас стоит 100Мб.
6 Строки 8-10. Список допустимых расширений для файлов. Переменная $extentions.
7 Строка 11. Определяем размер файла в переменной $size.
8 Строка 12. Определяем расширение файла в перемнной $type.
9 Строка 13. Задаём новое имя файла, если оно надо.
10 Строки 14-19. Проверка соответствия размера файла.
11 Строки 20-25. Проверка расширения файла
12 Строки 26-35. Выполняются, только если прошла проверка на расширение и размер файла. Здесь уже сохраняется файл, и результат сохранения будет сказан.
Не стоит забывать о… Три нюанса
Первое, о чём не стоит забывать, это о расширениях файлов.
Всегда проверяйте их, потому что если загрузить скриптик на сервер, то можно удалить всё без всяких усилий.
Второй нюанс был найден методом проб и ошибок и связан вот с чем. Если файл html и файл обработчика разделить (например, на htmlcode.html и phpcode.php), то файл хтмл может находится вообще на любом сервере и в нём будет прописан путь к файлу php на другом сервере. То есть можно злоумышленничать при помощи того.
Ну а третий нюанс с защитой не связан. Просто помните про 6 строчку в коде, иногда нужна =).
Другие статьи по рубрике «PHP и MySql»
Работа с директивами PHP.ini в httpd.conf
Форма обратной связи на языке PHP