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

Первым делом, что нужно усвоить - это то, что сама HTML-форма , в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:





Ключевой момент здесь - это атрибут "enctype " со значением "multipart/form-data ". Без него ничего работать не будет.

", в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

print_r($_FILES);
?>

В результате, Вы увидите содержимое глобального двумерного массива $_FILES :

  • name - имя загружаемого файла.
  • type - MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type , иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
  • tmp_name - физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
  • error - код ошибки. Если 0 , то ошибок нет.
  • size - размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов . Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ ).

И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES ).

Теперь давайте уже закончим с загрузкой файлов на сервер в PHP , и для этого напишем такой код (""):

$uploadfile = "images/".$_FILES["somename"]["name"];
move_uploaded_file($_FILES["somename"]["tmp_name"], $uploadfile);
?>

То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images " с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

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

Для этого нам понадобится html форма с полем ввода типа . Кроме того, для передачи файлов на сервер необходимо форме установить тип multipart . Для этого в качестве параметра enctype указывается значение multipart/form-data .

После того, как на html страничке мы разместим форму с полем в окне браузера отобразится поле с возможностью выбрать файл на локальном компьютере.

После того, как пользователь выберет нужный файл и нажмет кнопку «Загрузить» форма передаст данные php скрипту на сервер, который указан в action формы. Если action формы пустой, то данные будут переданы тому же файлу, на котором находится форма. Вся информация о загружаемом файле помещается в массив $ _FILES . Нам лишь остается извлечь эту информацию и переместить файл в необходимое нам место.

Прежде, чем приступить к написанию скрипта обработки multipart-формы , нужно отредактировать файл конфигурации php.ini , чтобы разрешить загрузку файлов на сервер.

Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:

  • file_uploads = On - разрешает загрузку файлов на сервер по протоколу HTTP;
  • upoad_tmp_dir = /tmp - устанавливает каталог для временного хранения загруженных файлов;
  • upload_max_filesize = 2M - устанавливает максимальный объем загружаемых файлов.

Итак, создайте новый файл с именем upload.php и скопируйте в него следующий код.

Если внимательно посмотреть на форму, то Вы увидите скрытое поле

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

После того как пользователь выбрал файл и нажал на кнопку «Загрузить», вся информация о файле, как упоминалось ранее, помещается в массив $ _FILES, а сам файл помещается во временный каталог на сервере, который указан в в php.ini.

Так как поле file называлось name="uploadFile" , то массив $ _FILES будет содержать ассоциативный массив с ключом "uploadFile" .

  • $_FILES[" uploadFile "]["name"] - имя файла до его отправки на сервер, например, pict.gif;
  • $_FILES[" uploadFile "]["size"] - размер принятого файла в байтах;
  • $_FILES[" uploadFile "]["type"] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
  • $_FILES[" uploadFile "]["tmp_name"] - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;
  • $_FILES[" uploadFile "]["error"] - Код ошибки, которая может возникнуть при загрузке файла.

После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта.

Итак, с алгоритмом разобрались! Теперь давайте взглянем на код.

Первым делом мы проверяем была ли нажата кнопка submit.

If(isset($_POST["upload"])) { }

If(is_uploaded_file($_FILES["uploadFile"]["tmp_name"])) { Выполняем действие над файлом } else { echo "Файл не загружен"; }

Если файл был загружен через HTTP POST, то далее мы его перемещаем из временного каталога в нужный нам каталог. Это делается при помощи функции move_uploaded_file, которая принимает два параметра: имя файла для загрузки и путь куда будет перемещен файл. В случае успешного перемещения файла, данная функция возвратит true, в противном случае -false.

If(move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $uploadedFile)) { echo Файл загружен; } else { echo Во время загрузки файла произошла ошибка; }

В нашем случае в качестве имени файла выступает имя временного файла на сервере - $_FILES["uploadFile"]["tmp_name"], а в качестве каталога, куда будет перемещен файл - переменная $uploadedFile, которая было объявлена выше в скрипте и содержит новое место хранения файла.

$folder = "path/to/folder/"; $uploadedFile = $folder. basename($_FILES["uploadFile"]["name"]);

Из своего опыта могу сказать, что хранить оригинальное название файла на сервере не стоит, поэтому его можно переименовать. Для этого сгенерируем случайное название для нашего файла и функция move_uploaded_file() переместит и переименует наш файл:

// Получаем расширение файла $file_ext = strtolower(strrchr($_FILES["uploadFile"]["name"],".")); // Генерируем случайное число $file_name = uniqid(rand(10000,99999)); // Формируем путь на сервере $uploadedFile = $folder.$file_name.$file_ext;

Ну и напоследок приведу список возможных ошибок, которые возникают во время загрузки файлов на сервер. Напоминаю, что код ошибки хранится в переменной $_FILES[" uploadFile "]["error"]:

  • 0- Ошибок не возникало, файл был успешно загружен на сервер.
  • 1- Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini..
  • 2- Размер загружаемого файла превысил значение MAX_FILE_SIZE , указанное в HTML-форме.
  • 3- Загружаемый файл был получен только частично.
  • 4- Файл не был загружен.
  • 6- Нет временную папку.
  • 7- Сбой при записи файлов на диск.

Как видите, организовать загрузку файлов на сервер не так уж и сложно. Сложнее обеспечить необходимый уровень безопасности, так как загрузка файлов на сервер может использоваться злоумышленниками для атаки на сервер.

При помощи нашего скритпа злоумышленник сможет загружать произвольные файлы на сервер, к примеру, он сможет закачать на сервер php-скрипт, который рекурсивно сможет удалить все ваши файлы на сервере или PHP-shell, так что если вы пишите свой загрузчик файлов, то к этому делу надо подойти серьезно, ничего не упустив.

В нашем примере я не ставил перед собой такой задачи, а лишь показал Вам весь механизм загрузки файлов на сервер, но в следующей статье, я покажу, как обеспечить необходимый уровень безопасности!

От автора: приветствую вас друзья. Из этой небольшой статьи вы узнаете, как сделать форму загрузки файла на сайте. Это позволит прикреплять картинки и прочие файлы к форме и отправлять файлы на сервер, где они уже будут обработаны. Начнем.

Исходные файлы текущей статьи вы можете скачать по .

Начнем с создания формы, в которой будет присутствовать поле для загрузки файла. На что здесь стоит обратить внимание? Во-первых, поле для отправки файла должно иметь специальный тип – type=»file». Во-вторых, файл может быть отправлен только в теле запроса, поэтому метод GET для отправки формы не подойдет, нужно использовать только метод POST — method=»post». Ну и, в-третьих, для формы необходим специальный атрибут enctype с определенным значением — enctype=»multipart/form-data». Без этого атрибута файл просто не будет отправлен.

Исходя из озвученного выше, наш код будет примерно таким:

< form class = "form-horizontal" method = "post" enctype = "multipart/form-data" action = "file.php" >

< div class = "form-group" >

< label for = "name" class = "col-sm-2 control-label" > Названиефайла< / label >

< div class = "col-sm-8" >

< input type = "text" id = "name" class = "form-control" name = "name" placeholder = "Название файла" >

< / div >

< / div >

< div class = "form-group" >

< label for = "file" class = "col-sm-2 control-label" > Файл< / label >

< div class = "col-sm-8" >

< input type = "file" name = "file" id = "file" >

< / div >

< / div >

< div class = "form-group" >

< div class = "col-sm-offset-2 col-sm-8" >

< button type = "submit" id = "submit" class = "btn btn-primary" > Отправить< / button >

< div > < / div >

< / div >

< / div >

< / form >

В результате мы получим примерно такую форму:

Поле для загрузки файлов выглядит не очень привлекательно, но, тем не менее, со своей задачей справится без проблем: файл можно прикрепить и отправить на сервер. В следующей статье мы попробуем красиво оформить поле для загрузки файла, а пока давайте проверим, загружается ли файл. Как видим, форма будет отправлена в файл file.php, который указан в атрибуте action. Давайте создадим этот файл.

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Загрузка файлов на сервер

Краткий эксурс в upload

Что такое Upload files, или почему не работает
copy ("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg ")

Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения - сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:

Send this file:

При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение - проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.

Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку "Send file"? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.

Как должен выглядеть upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["name"])) { print "File is valid, and was successfully uploaded."; } else { print "There some errors!"; }

При написании скрипта, возникает естественный вопрос: как получить информацию о загруженном файле и достучаться до самого файла. Если Вы используете PHP версии 4.1.0 и старше, лучше всего будет обратиться к глобальному массиву $_FILES. Для каждого загруженного файла он содержит хеш-массив, со следующими данными:

  • $_FILES["userfile"]["name"] - оригинальное имя файла, такое, каким его видел пользователь, выбирая файл;
  • $_FILES["userfile"]["type"] - mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
  • $_FILES["userfile"]["size"] - размер загруженного файла;
  • $_FILES["userfile"]["tmp_name"] - полный путь к временному файлу на диске;
  • $_FILES["userfile"]["error"] - Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно.

Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;

Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах - использовать массив $_FILES.

Для работы с загруженными файлами лучше всего использовать встроенные функции is_uploaded_file() и move_uploaded_file() , которые проверяют, был ли загружен файл, и помещают его в указанную папку соответственно. Более детальную информацию Вы можете найти на страницах руководства. Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.

Настройка сервера

Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?

Если Вы "все сделали правильно", но Ваш код неработает, или работает неправильно, не спешите отчаиваться. Возможно проблема не в Ваших руках, а в неверных настройках сервера. Вот список директив, которые имеют отношения к загрузке файлов:

В файле php.ini:

  • Если Вы хотите узнать, где расположен Ваш php.ini, выполните
  • file_uploads - возможность запретить или разрешить загрузку файлов в целом. По умолчанию On.
  • upload_max_filesize - максимальный размер файла, который может быть загружен. Если Вам необходимо работать с большими файлами, измените эту настройку. По умолчанию 2М. Не забудьте изменить post_max_size.
  • post_max_size - общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо работать с большими файлами, или передавать несколько файлов одновременно, измените эту настройку. Значение по умолчанию 8М.
  • upload_tmp_dir - временная директория на сервере, в которую будут помещаться все загружаемые файлы. Проверьте, какие на нее выставлены права(если на данном этапе у Вас возникли сложности, смотрите пояснения в конце статьи). Такая директория должна существовать и у пользователя, под которым выполняется Apache, также должны быть права на запись в эту директорию. Если Вы работаете с включенным ограничением open_basedir - то временный каталог должен находиться внутри. Вам не нужно заботиться о ее чистке или об уникальности имен, PHP решает эту проблему за Вас.

В файле httpd.conf :

  • Прежде всего, убедитесь, что Вы используете веб-сервер Apache 1.3 (последняя версия на момент написания статьи - 1.3.27). Если Вы используете Apache 2.0, Вам следует прочитать следующий отрывок из документации:

    Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.

  • Если Вы получили сообщение "POST Method Not Allowed", это означает, что надо искать что-то похожее на следующие директивы, и использовать ключевое слово Allow: Order allow,deny Allow from all
  • Проблемы с загрузкой бинарных файлов - классический вопрос "почему бьются файлы при upload". Вот способ решения, предложенный Димой Бородином (http://php.spb.ru): В директории, где лежит скрипт, делаем файл .htaccess , в котором пишем: CharsetDisable On В файл httpd.conf дописать строки: CharsetRecodeMultipartForms Off

Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.

Но при этом могут возникнуть осложнения: будьте готовы к тому, что в некоторых случаях текстовые части запросов вам придется перекодировать самостоятельно. Вот что по этому поводу говорится в документации:

Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.

Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps

Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.

Не забывайте, что после любой смены конфигурации, Вам необходимо перезапустить Ваш веб-сервер.

Также возможна настройка параметров Apach с помощью.htaccess:

Php_value upload_max_filesize 50M php_value post_max_size 50M

Дополнительные возможности

Загрузка нескольких файлов одновременно

Пример формы загрузки нескольких файлов:

Send these files:


И не забудьте увеличить post_max_size , если предполагается много файлов

Автоматическая загрузка файлов на сервер

Не стоит забывать, что файлы на диске пользователя - конфиденциальная информация, к которой ни JavaScript, ни уж тем более PHP не имеют ни малейшего отношения. До тех пор, пока пользователь сам не выбрал файл при помощи ни о какой работе с ним не может идти и речи. И не забывайте, что у данного поля ввода атрибут value защищен от записи.

Хранение файлов в базе данных mySQL

Если Вы собрались хранить загружаемы файлы в базе данных, Вам необходимо помнить следующие моменты:

  • Необходимо использовать поле типа BLOB
  • Перед тем, как класть в базу, не забыть применить к строке mysql_escape_string()
  • При отображении файла необходимо указывать заголовок content/type

Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.

Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.

Получение свойств изображения.

Если перед вами возникла задача проверить тип или размеры картинки перед загрузкой файла на сервер, вам потребуется функция getimagesize() . В качестве аргумента она принимает имя файла на диске и возвращает массив, первые два элемента которого - ширина и высота соответственно, третий - тип изображения. В случае невозможности прочитать из указанного файла корректное изображение, функция возвращает ложь.

Загрузка файлов, имеющих русско-язычное название

При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия "нестандартных" символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES["userfile"]["name"]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP .

Отображения статуса загрузки (Progress bar)

Необходимо учитывать, что до полной загрузки файла, PHP не может оперировать ни размером файла, ни процентом его загрузки. Только когда файл уже находится на сервере PHP, то он получает возможность обращаться к информации. Если вам все-таки крайне необходимо реализовать такую возможность, воспользуйтесь Java-аплетом.

Права на файлы

Проблемы с правами на сервере (upload_tmp_dir)

В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.

Доступность файла или каталога зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой:

Владелец Группа Прочие (u) (g) (o) rwx rwx rwx

Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. Права - любая осмысленная комбинация следующих букв:

r Право на чтение. (4)
w Право на запись. (2)
x Право на выполнение (поиск в каталоге). (1)

  • Установить владельцем каталога пользователя, с чьими привелегиями выполняется apache. Это можно узнать из файла httpd.conf или просмотрев список процессов на сервере. Права на каталог должны быть 700 (rwx------).
  • Независимо от того, кто является владельцем каталога, установить права 777 (rwxrwxrwx).

    Пример реализации загрузки картинок на сервер.

    $max_image_width = 380; $max_image_height = 600; $max_image_size = 64 * 1024; $valid_types = array("gif","jpg", "png", "jpeg"); if (isset($_FILES["userfile"])) { if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) { $filename = $_FILES["userfile"]["tmp_name"]; $ext = substr($_FILES["userfile"]["name"], 1 + strrpos($_FILES["userfile"]["name"], ".")); if (filesize($filename) > $max_image_size) { echo "Error: File size > 64K."; } elseif (!in_array($ext, $valid_types)) { echo "Error: Invalid file type."; } else { $size = GetImageSize($filename); if (($size) && ($size < $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Send this file:
    "; }

    Оригинал статьи находится на сайте PHP Club


    Как скачать файл с сервера?
  • В нашей статье мы рассмотрим пример создания php скрипта загрузки файлов на сервер. Наш простой пример загрузки файлов будет иметь 2 файла: форма (form.html), php скрипт загрузки файлов (uploader.php).

    Теперь разберем все детально. Сначала проанализируем файл формы form.html:


    Как видите это простой html код, ничего сложного здесь нет, единственное, если форма будет загружать файлы на сервер, то должен быть прописан атрибут enctype=" multipart/ form- data" .

    Наша форма будет выглядеть так:

    Пример PHP скрипта загрузки файлов

    Теперь разберемся с php файлом, который будет загружать файлы на сервер. Ниже предоставлен его исходный код:

    // Where the file is going to be placed $target_path = ‘uploaded_files/"; /* Add the original filename to our target path. Result is "uploaded_files/filename.extension" */ $target_path = $target_path . basename($_FILES["file"]["name"]); if(move_uploaded_file($_FILES["file"]["tmp_name"], $target_path)) { echo "The file ". basename($_FILES["file"]["name"]). " has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; }

    Как работает PHP скрипт загрузки файлов?

    uploader.php это простой php скрипт загрузки файлов на сервер, который будет загружать наши файлы в определенную директорию сайта, которая указывается строкой $target_path = "uploaded_files/";

    Ну и само собой делаем элементарный вывод сообщений с помощью if/else, чтобы понятно было, загружен наш файл или нет.

    Защита от хакерских взломов при загрузке файла

    Мы рассмотрим не только защиту в плане хакерских взломов, но и другие нежелательные проблемы, возникающие при загрузке файлов на сервер.

    PHP оболочка файла

    Это первая проблема, связанная с загрузкой файлов на сервер. Когда загружаемый файл имеет оболочку php, и это не значит, что его расширение будет php. Он может иметь вид image.jpg (.gif, .png…). Но внутри выглядеть подобным образом:

    Некоторые умельцы также могут выполнять команды на сервере с помощью серфинга по url:

    $ curl http://server/uploads/shell.php?command=any_unix_command

    Способ защиты:

    Для защиты, можно реализовать MIME проверку файла. Ниже смотрите пример:

    If($_FILES["file"]["type"] != "image/gif") { echo "Sorry, we only allow uploading GIF images"; exit; }

    Данный кусок php кода проверяет, является ли загружаемый файл GIF файлом. Вставьте этот код перед php скриптом загрузки файлов. Естественно, вы можете поменять проверку на jpg, pngили другие нужные вам файлы.

    По правде сказать, и этот способ защиты можно обойти, если послать заголовок header, с указаниями MIME. Для этого необходимо производить проверку наличия тегов в загружаемом файле.

    Ограничение размера загружаемого файла

    Также могут возникнуть проблемы с большими размерами файлов, которые будут занимать ваше дисковое пространство. Для этого нужно написать ограничение на размер загружаемого файла.

    Можно это сделать с помощью формы, для этого нужно добавить следующую строку в контекст html формы:

    Это скрытое поле ввода ограничит размер загружаемого файла. Или можно сделать проверку размера файла средствами PHP.

    Писать о php скрипте загрузки файлов можно долго, но мы уже разобрали основный принцип загрузки файлов на сервер. Поэтому, если у кого-то есть еще вопросы, задайте их в комментариях.