Как загрузить файл в бд php

Обновлено: 04.07.2024

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

HTML форма отправки файла

Самая простая форма загрузки файла:

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

Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.

Параметр method указывает метод отправки данных. Формы для загрузки файлов обычно используют метод передачи POST. Подробней о методах отправки форм можно узнать в статье "Отличия методов POST или GET"

Параметр action содержит ссылку на PHP-файл, содержащий код обработки отправляемых данных.

Параметр MAX_FILE_SIZE, указанный в форме определяет максимальный размер файла, заданный в байтах. По умолчанию, этот размер определяется настройками сервера.

Для указания загружаемого файла тег <input> должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".

Отправка данных формы выполняется тегом <input> с типом "submit". Он отображается обычной кнопкой.

PHP код сохранения файла

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

В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES['my_file']. Такой массив содержит следующую информацию:

$_FILES['my_file']['name'] имя отправляемого файла
$_FILES['my_file']['size'] размер загруженного файла в байтах
$_FILES['my_file']['type'] MIME-тип принятого файла. Если он определяется, содержит, например: image/gif, image/png, image/jpeg, text/html
$_FILES['my_file']['tmp_name'] содержит имя файла во временном каталоге, например: /tmp/phpR4n5wJ
$_FILES['my_file']['error'] код ошибки $_FILES, если она возникла при загрузке файла

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

Копирование выполняется функцией copy(), параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES['my_file']['tmp_name']) и имя конечного файла.

В итоге должен получиться следующий код:

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

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

Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.

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

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

Настройка параметров PHP

Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.

Если вы не знаете, где найти файл php.ini, вы можете использовать php_ini_loaded_file() , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.

Вот выдержка из установочного файла с некоторыми полезными значениями по умолчанию.

Ключевые настройки

file_uploads

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

upload_max_filesize

upload_tmp_dir

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

post_max_size

Директива post_max_size позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве upload_max_filesize . Например, если ваш upload_max_filesize составляет 16M (16 мегабайт), вам может потребоваться установить post_max_size в 20M .

max_file_uploads

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

max_input_time

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

memory_limit

Директива memory_limit указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве post_max_size . Значение по умолчанию - 128M (128 мегабайт), поэтому, если у вас нет очень больших post_max_size и upload_max_filesize , вам не нужно беспокоиться об этом.

max_execution_time

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

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

Создание формы HTML

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

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

Мы собираемся создать два файла PHP: index.php и upload.php. Файл index.php содержит код, который отвечает за отображение формы загрузки файла. С другой стороны, файл upload.php отвечает за загрузку файла на сервер.

Кроме того, файл будет загружен в каталог uploaded_files, поэтому вам нужно убедиться, что эта папка существует и доступна для записи пользователем web-server .

В этом разделе мы рассмотрим ключевые части файла index.php.

Давайте посмотрим на файл index.php на GitHub:

Хотя это может показаться типичной формой PHP, существует важное различие в значении атрибута enctype тега <form> . Он должен быть установлен в multipart/form-data , так как форма содержит поле файла.

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

  • application/x-www-form-urlencoded : Это значение по умолчанию, когда вы не устанавливаете значение атрибута enctype явно. В этом случае символы кодируются перед отправкой на сервер. Если у вас нет поля файла в вашей форме, вы должны использовать это значение для атрибута enctype .
  • multipart/form-data : Когда вы используете значение multipart/form-data для атрибута enctype , оно позволяет загружать файлы с использованием метода POST. Кроме того, он гарантирует, что символы не кодируются при отправке формы.
  • text/plain : Обычно это не используется. С помощью этой настройки данные отправляются без кодирования.

Затем мы выводим поле файла, которое позволяет вам выбрать файл с вашего компьютера.

Итак, это был файл index.php. В следующем разделе мы рассмотрим, как обрабатывать загруженный файл на стороне сервера.

Логика загрузки

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

Загрузите код из файла upload.php на GitHub. Мы рассмотрим важные части этого файла.

В файле upload.php мы проверили, действительно ли это валидный запрос POST.

В PHP, когда файл загружается, суперглобальная переменная $_FILES заполняется всей информацией о загруженном файле. Она инициализируется как массив и может содержать следующую информацию для успешной загрузки файла.

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

Вы можете видеть, что переменная $_FILES является многомерным массивом, первый элемент - это имя поля файла, а второй элемент содержит информацию о загруженном файле, как мы уже говорили выше.

Если загрузка файла прошла успешно, мы инициализируем несколько переменных с информацией о загруженном файле.

В приведенном выше коде мы также выяснили расширение загруженного файла и сохранили его в переменной $fileExtension .

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

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

Наконец, мы используем функцию move_uploaded_file для перемещения загруженного файла в определенное место по нашему выбору.

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

Как это все работает вместе

Не забудьте создать каталог uploaded_files и сделать его доступным для записи пользователем web-server. Затем перейдите и запустите файл index.php, который должен отобразить форму загрузки файла, которая выглядит так:

Indexphp File Output
Indexphp File Output
Indexphp File Output

Заключение

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

Надеюсь, вам понравилась эта статья, и вы можете свободно размещать свои вопросы и предложения ниже!

Загрузка файла(ов) на сервер из формы средствами PHP

Сегодня загрузка файлов является практически неотъемлемым атрибутом современного web приложения. В данной статье речь пойдёт о том, как же загрузить файл(ы) на сервер с помощью PHP.

Настройка php.ini

Конфигурационный файл php.ini необходимо настраивать согласно бизнес-логики проекта! Например, мы планируем загружать не более десяти файлов до 2 Мбайт, а это значит нам понадобиться

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

После отправки файла PHP-скрипту upload.php его можно перехватить с помощью суперглобальной переменной $_FILES с таким же именем, которая в массиве содержит информацию о файле (в нашем случае image ):

Для того, чтобы "редиска" не загрузил вредоносный код, встроенный в изображение, нельзя доверять функции getimagesize() , которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo . Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

Таким образом, при необходимости, делаем проверку и на другие MIME-типы. Например, для zip архивов проверка будет такая:

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize() , которой отдадим сам бинарный файл $_FILES['image']['tmp_name'] . В результате мы получим массив из элементов:

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

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

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

Генерация имени для картинки теперь будет такой:

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

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

Разберём механизм загрузки нескольких изображений за один раз с локальной машины пользователя. Продолжим дальше работать с $_FILES . Наша новая HTML-форма будет немного отличаться от старой.

Как видно в конец имени поля выбора файла name="images[]" добавились фигурные скобки и атрибут multiple , который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES , но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

Мы реализовали механизм загрузки нескольких файлов на сервер. Весь код целиком лежит здесь .

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

Настройка параметров PHP

Существует множество различных настроек конфигурации PHP, которые нам следует сначала проверить для успешной загрузки файлов. В этом уроке мы рассмотрим некоторые параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.

Где находится php.ini?

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

    Создаем файл PHP, например, phpinfo.php и добавляем в него следующие строки:

Приведём фрагмент из установочного файла с некоторыми полезными значениями по умолчанию:

Установите значение директивы file_uploads на On , чтобы разрешить загрузку файлов.

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

Файлы на сервер загружаются с помощью POST-запросов, поэтому значение директивы post_max_size должно быть больше, чем указано в директиве upload_max_filesize .

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

Максимальный объем памяти, который может потреблять скрипт, указан в директиве memory_limit . Если у вас возникают проблемы при загрузке больших файлов, то нужно проверить, чтобы это значение было больше, чем указано в post_max_size .

Создание формы загрузки

Сделаем HTML-форму для загрузки файла на сервер:

Пример

Обратите внимание на правила, которых следует придерживаться для приведенной выше HTML-формы:

  • Убедитесь, чтобы в форме для атрибута method было установлено значение "post"
  • Для атрибута enctype установите значение "multipart/form-data" , оно позволяет загружать файлы с использованием метода POST. Кроме того, он гарантирует, что символы не кодируются при отправке формы.

Затем мы выводим поле файла, которое позволяет нам выбрать файл с компьютера:

Форма выше отправляет данные в файл-обработчик с именем "upload.php", который мы создадим дальше.

Создание сценария загрузки файла

Итак, создадим файл upload.php со следующим содержимым:

upload.php

Рассмотрим объявленные переменные в сценарии PHP:

  • $target_dir = "uploads/" — директория, в которую будет помещен загружаемый файл.
  • $target_file — путь к загружаемому файлу
  • $uploadOk = 1 — флаг, назначение которого будет объяснено ниже
  • $imageFileType — расширения загружаемых файлов (в нижнем регистре)

Функция pathinfo() возвращает ассоциированный массив, содержащий информацию об имени, расширении и директории файла. Первым параметром мы передали $target_file (путь к загружаемому файлу), а вторым — PATHINFO_EXTENSION (расширение файла). С помощью функции strtolower() все буквенные символы расширеня переводим в нижний регистр.

При отправке файла на сервер он сначала загружается во временное место $_FILES["fileToUpload"]["tmp_name"] , из которого затем с помощью функции move_uploaded_file() он перемещается в каталог сервера.

Примечание: Файлы будут загружены в каталог "uploads/", поэтому вам нужно создать его в каталоге, в котором находится файл «upload.php».

Проверка существования файла

// Проверка существования файла
if (file_exists($target_file)) echo "Извините, файл уже существует";
$uploadOk = 0;
>

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

Все загружаемые файлы попадают в суперглобальную переменную $_FILES .

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

Так как элемент для загрузки файла на форме имеет name='filename' , то данный файл мы можем получить с помощью выражения $_FILES['filename'] .

У каждого объекта файла есть свои параметры, которые мы можем получить:

$_FILES['file']['name'] : фактическое имя загруженного файла

$_FILES['file']['type'] : MIME-тип загружаемого файла, например, image/jpeg

$_FILES['file']['size'] : размер загружаемого файла в байтах

$_FILES['file']['tmp_name'] : имя временного файла, сохраненного на сервере

$_FILES['file']['error'] : код ошибки, связанной с загрузкой этого файла

Поле ввода файла в нашей HTML-форме называется fileToUpload .

// Проверить размер файла
if ($_FILES["fileToUpload"]["size"] > 500000) echo "Извините, ваш файл слишком велик";
$uploadOk = 0;
>

Ограничение типа файла

// Разрешить определенные форматы файлов
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) echo "К загрузке разрешены только файлы JPG, JPEG, PNG и GIF";
$uploadOk = 0;
>

Полный скрипт загрузки файла

Пример

Как отмечалось выше, при отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file() он перемещается в созданный нами каталог сервера (мы прописали его в файле php.ini).

Функция move_uploaded_file() принимает два параметра — путь к загруженному временному файлу и путь, куда надо поместить загруженный файл.

Мы также используем функцию htmlspecialchars() для кодирования всех специальных символов HTML в отправленном нам файле.

Читайте также: