Разделы сайта
Выбор редакции:
- Динамическое изменение размера шрифта на jQuery Задание на работу
- Как пользоваться беспроводной Bluetooth гарнитурой Сколько по времени заряжать беспроводные наушники
- Прошивка Explay N1 (планшет)
- Как полностью удалить программу с компьютера – пошаговая инструкция Где удалять программы
- Как перепрошить «мёртвые» телефоны Nokia с помощью программы Phoenix
- Перенос данных между смартфонами MEIZU
- Microsoft Garage Mouse контролируем два компьютера одной мышью
- Скачать последнюю версию виндовс медиа
- Алексей алексеев добро пожаловать в мой уютненький бложек Создание риб в 1с 8
- «Битрикс24» - что это такое?
Реклама
Загрузка файлов на сервер с помощью PHP. Загрузка файлов с помощью PHP на сервер Php post отдать файл для загрузки |
От автора: приветствую вас друзья. Из этой небольшой статьи вы узнаете, как сделать форму загрузки файла на сайте. Это позволит прикреплять картинки и прочие файлы к форме и отправлять файлы на сервер, где они уже будут обработаны. Начнем. Исходные файлы текущей статьи вы можете скачать по . Начнем с создания формы, в которой будет присутствовать поле для загрузки файла. На что здесь стоит обратить внимание? Во-первых, поле для отправки файла должно иметь специальный тип – type=»file». Во-вторых, файл может быть отправлен только в теле запроса, поэтому метод GET для отправки формы не подойдет, нужно использовать только метод POST — method=»post». Ну и, в-третьих, для формы необходим специальный атрибут enctype с определенным значением — enctype=»multipart/form-data». Без этого атрибута файл просто не будет отправлен. Исходя из озвученного выше, наш код будет примерно таким:
В результате мы получим примерно такую форму: Поле для загрузки файлов выглядит не очень привлекательно, но, тем не менее, со своей задачей справится без проблем: файл можно прикрепить и отправить на сервер. В следующей статье мы попробуем красиво оформить поле для загрузки файла, а пока давайте проверим, загружается ли файл. Как видим, форма будет отправлена в файл file.php, который указан в атрибуте action. Давайте создадим этот файл. Сегодня сервис по загрузке файла на сервер (хостинг) встречается на всех сайтах социальных сетей, досках объявлений, сайтах знакомств и др. Суть его заключается в том, чтобы дать возможность посетителю веб ресурса опубликовать свои файлы (фото, документы) на просторах интернета. При предоставлении данного сервиса есть один существенный минус. Дело в том, что разрешая загружать файл на свой сервер, мы как бы устанавливаем дверь, за которой необходим постоянный контроль. Так как в файле посетителя может быть не только полезная информация, но и вирусный код, который впоследствии может дать возможность злоумышленникам завладеть вашим сервером. Учитывая данный минус, необходимо тщательно проверять файлы до загрузки на сервер. Но не буду вас запугивать, а лучше представлю вашему вниманию уже готовую функцию (PHP скрипт) для проверки и загрузки файлов на сервер. Функция 100% рабочая. Я сам использую её на своих сайтах. Данная функция написана под загрузку файлов изображений (фоток) в формате.jpg, .gif, .png. Но при желании можно внести изменения, чтобы адаптировать PHP скрипт под свои нужды.
В php скрипте реализованы две проверки:
Надеюсь в коде функции достаточно пояснений, чтобы разобраться с загрузкой файла на сервер. Но если возникнут вопросы, с удовольствием отвечу в комментариях. Теперь о том, как это реализовать практическиПомещаем PHP код функции в отдельный файл: function.php и размещаем его на сервере в корневом каталоге.
И создадим html-файл в котором разместим форму для загрузки фото: index.html
upload.php - файл обработчик формы Загрузка нескольких файловТеперь разберем случай, когда необходимо загрузить на сервер сразу несколько файлов.
Пожалуй, это все, что вам необходимо для реализации сервиса по загрузке пользовательского файла на сервер (хостинг). Еще одна функция, которая тесно связана с загрузкой графических файлов (фоток) - это функция для изменения размеров фотки: Практически в каждом проекте разработчик сталкивается с необходимостью загрузки файлов на сервер. Фотографии, картинки, документы, архивы и многое другое может быть загружено на сервер посредством web-интерфейса (через браузер). Http://localhost/index.php?name=myname&page=10 определяет запрос GET к странице index.php. При этом скрипту передаются параметры "name" и "page" со значениями "myname" и "10" соответственно. Как видите, запрос состоит из пар "имя=значение", объединённых через "&". Запрос отделяется от адреса страницы знаком вопроса "?". Но GET не подходит для передачи больших данных. Для этого существует метод POST. Этот метод передаёт данные скрыто от пользователя, а адрес страницы остаётся неизменным. Теоретически, метод POST позволяет передавать огромные блоки данных, но большинство провайдеров устанавливают жесткое ограничение в 5-10 мегабайт. Для реализации загрузки файла необходимо снабдить пользователя соответствующей формой. Для загрузки файлов предназначен тег input типа file.
Пользователь выбирает нужный файл, нажимает кнопку "Отправить!", после чего браузер передаёт указанный файл на сервер. По окончании загрузки файла запускается receiver.php, и ему автоматически становятся доступны все переданные в форме данные. Список загруженных файлов хранится в глобальном массиве $_FILES. Это ассоциативный массив, где каждый элемент содержит описание одного из файлов. Рассмотрим на примере: 3145728) { $filesize = ($filesize != 0)? sprintf("(%.2f Мб)" , $filesize / 1024): ""; die("Ошибка: Размер прикреплённого файла ". $filesize." больше допустимого (3 Мб)."); } else { $filename = $_FILES["file"]["name"]; $filepath = $_FILES["file"]["tmp_name"]; $filetype = $_FILES["file"]["type"]; if($this->filetype == null || $this->filetype == "") $this->filetype = "unknown/unknown"; } } } echo "Успешно загружен файл: " . $filename; ?> Все загруженные файлы сохраняются сервером во временном каталоге и автоматически удаляются после завершения скрипта. Если вам необходимо сохранить файл на сервере - его надо переместить в один из каталогов сайта. Для этого служит специальная функция move_uploaded_file() . Обчно она используется в паре с функцией is_uploaded_file() , которая позволяет определить, был ли файл загружен через форму. Например:
Информация о каждом загруженном файле представляется в скрипте как элемены массива $_FILES. Имя элемента определяется атрибутом name тега формы. В нашем случае атрибут name равен "ufile", значит данные об этом файле будут храниться в элементе $_FILES["ufile"]. Каждый элемент $_FILES так же является массивом, содержащим пять элементов с фиксированными именами: Размер загружаемых файлов может значительно меняться от провайдера к провайдеру. Некоторые администраторы вообще запрещают загрузку файлов. В этом случае файл всё равно может загрузиться, сервер его удалит, а скрипту сообщит, что файл был, но уже удалён. Последнее обновление: 1.11.2015 Чтобы загрузить файл на сервер, нам надо использовать форму с параметром enctype="multipart/form-data" и массив $_FILES . Итак, создадим файл upload.php со следующим содержимым:
Загрузка файлаЗдесь определена форм с атрибутом enctype="multipart/form-data" . Форма содержит специальное поле для выбора файла. Все загружаемые файлы попадают в ассоциативный массив $_FILES . Чтобы определить, а есть ли вообще загруженные файлы, можно использовать конструкцию if: if ($_FILES) Массив $_FILES является двухмерным. Мы можем загрузить набор файлов, и каждый загруженный файл можно получить по ключу, который совпадает со значением атрибута name . Так как элемент для загрузки файла на форме имеет name="filename" , то данный файл мы можем получить с помощью выражения $_FILES["filename"] . У каждого объекта файла есть свои параметры, которые мы можем получить: $_FILES["file"]["name"] : имя файла $_FILES["file"]["type"] : тип содержимого файла, например, image/jpeg $_FILES["file"]["size"] : размер файла в байтах $_FILES["file"]["tmp_name"] : имя временного файла, сохраненного на сервере $_FILES["file"]["error"] : код ошибки при загрузке Также мы можем проверить наличие ошибок при загрузке. Если у нас нет ошибки, то поле $_FILES["filename"]["error"] содержит значение UPLOAD_ERR_OK . При отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file() он перемещается в каталог сервера. Функция move_uploaded_file() принимает два параметра путь к загруженному временному файлу и путь, куда надо поместить загруженный файл. Ограничения и настройка загрузкиПо умолчанию размер загружаемых файлов ограничен 2 мб. Однако можно настроить данный показатель в файле конфигурации. Изменим этот показатель, например, до 10 мб. Для этого найдем в файле php.ini следующую строку: Upload_max_filesize = 2M Изменим ее на Upload_max_filesize = 10M Также мы можем настроить папку для временных загружаемых файлов. Для этого в файле php.ini найдем следующую строку: ;upload_tmp_dir = Изменим ее на Upload_tmp_dir = "C:/php/upload" Также в каталоге php нам надо создать папку upload . МультизагрузкаИзменим скрипт upload.php так, чтобы он поддерживал множественную загрузку: $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["uploads"]["tmp_name"][$key]; $name = $_FILES["uploads"]["name"][$key]; move_uploaded_file($tmp_name, "$name"); } } } ?> Загрузка файлаКаждое поле выбора файла имеет атрибут name="uploads" , поэтому сервер будет рассматривать набор отправленных файлов как единый массив. Затем используя цикл foreach , проходим по все файлам и сохраняем их в каталог веб-сайта. Multipart-формы
Загрузка файла на сервер осуществляется с помощью multipart -формы, в которой есть поле загрузки файла. В качестве параметра enctype указывается значение multipart/form-data : Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер): Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля:
Обработка multipart-форм Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini , чтобы разрешить загрузку файлов на сервер. Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:
Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис: service httpd restart Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir , имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES . Этот массив содержит информацию о загруженном файле. Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on , дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off . Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым.
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой: Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES["uploadfile"]["name"] . В этом случае скрипт должен сразу скопировать файл с именем $_FILES["uploadfile"]["tmp_name"] в какой-нибудь каталог (необходимы права на запись в этот каталог). Копирование файла производится функцией copy() : Используйте только функцию копирования copy() , а не перемещения, поскольку:
Предположим, нам нужно загрузить файл в каталог uploads , который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot ). // На всякий случай создадим каталог. Если он уже создан, @mkdir("uploads", 0777);
// Копируем файл из /tmp в uploads Copy($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"])); В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads . Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root , создайте каталог uploads и измените его владельца и права доступа следующим образом: // Создаем каталог uploads // Устанавливаем имя владельца apache и его группу - тоже apache: Chown apache:apache uploads // Разрешение записи всем (777) + установка закрепляющего бита (1): Chmod 1777 uploads Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads - указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса. Вот теперь можно загружать файлы на сервер. Пишем PHP скрипт загрузки файлов на сервер
php Оригинальное имя загруженного файла: "
echo " Mime-тип загруженного файла: " .$ _FILES [ "uploadfile" ][ "type" ]. "" ;echo " Размер загруженного файла в байтах: " .$ _FILES [ "uploadfile" ][ "size" ]. "" ;echo " Временное имя файла: " .$ _FILES [ "uploadfile" ][ "tmp_name" ]. "" ;?> Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input . Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox : В случае, если такая форма была отправлена, массивы $_FILES["userfile"] , $_FILES["userfile"]["name"] , и $_FILES["userfile"]["size"] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on , также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов. Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin . В таком случае переменная $_FILES["userfile"]["name"] будет иметь значение some.html , а переменная $_FILES["userfile"]["name"] - значение file.bin . Аналогично, переменная $_FILES["userfile"]["size"] будет содержать размер файла some.html и так далее. Переменные $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] и $_FILES["userfile"]["type"] также будут инициализированы. Заключение: Как видите, организовать загрузку файлов на сервер не так сложно. Сложнее обеспечить необходимый уровень безопасности, так как загрузка файлов на сервер может использоваться злоумышленниками для атаки на сервер. О том, как обеспечить необходимый уровень безопасности, работая с Uploads , смотрите .
|
Читайте: |
---|
Популярное:
Прошивка TWRP рекавери на Samsung |
Новое
- Как пользоваться беспроводной Bluetooth гарнитурой Сколько по времени заряжать беспроводные наушники
- Прошивка Explay N1 (планшет)
- Как полностью удалить программу с компьютера – пошаговая инструкция Где удалять программы
- Как перепрошить «мёртвые» телефоны Nokia с помощью программы Phoenix
- Перенос данных между смартфонами MEIZU
- Microsoft Garage Mouse контролируем два компьютера одной мышью
- Скачать последнюю версию виндовс медиа
- Алексей алексеев добро пожаловать в мой уютненький бложек Создание риб в 1с 8
- «Битрикс24» - что это такое?
- Описание тонкостей по выводу миниатюры записи wordpress