CMS

Как создать форму обратной связи с возможностью загрузки и отправки файла на почту PHP

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

Html формы с полем отправки файла

Html формы с полем отправки файла представлен ниже. При клике по кнопке «browse» пользователь получает возможность выбрать файл на своей локальной машине.


HTML

<form method="POST" name="email_form_with_php"
     action="php-form-action.php" enctype="multipart/form-data">

  <label for='name'>Имя: </label>
  <input type="text" name="name" id="name" >

  <label for='email'>Email: </label>
  <input type="text" name="email"  id="email" >
  
  <label for='message'>Message:</label>
  <textarea name="message" id="message" ></textarea>

  <label for='uploaded_file'>Выберите файл для загрузки :</label>
  <input type="file" name="uploaded_file" id="uploaded_file" >
  
  <input type="submit" value="Submit" name='submit'>

</form>

Форма будет выглядеть следующим образом:

Обратите внимание, что в атрибутах формы мы указали enctype="multipart/form-data". Это скажет браузеру, что форма может быть использована для отправки файлов. Также мы добавили поля «name» и «email» с целью собрать как можно больше информации о пользователе. Затем идет поле отправки файла.


HTML

<label for='uploaded_file'>Выберите файл для загрузки :</label>

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

Получаем информацию о загруженном файле

Сперва мы проверим полученные данные, затем, в случае успешной проверки, отправим данные на электронную почту.

Всю информацию о загруженных файлах можно получить при помощи массива $_FILES.

Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что значение атрибута name (у нас оно равно uploaded_file) в поле выбора файла может быть любым.

  • $_FILES['uploaded_file']['name']
         Оригинальное имя файла на компьютере пользователя.
  • $_FILES['uploaded_file']['type']
         Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: «image/gif». Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.
  • $_FILES['uploaded_file']['size']
         Размер в байтах принятого файла.
  • $_FILES['uploaded_file']['tmp_name']
         Временное имя, с которым принятый файл был сохранен на сервере.
  • $_FILES['uploaded_file']['error']
         Код ошибки, которая может возникнуть при загрузке файла. Этот элемент был добавлен в PHP 4.2.0

Получаем имя, тип и размер загруженного файла:

PHP

 //Получаем последний компонеет имени загруженного файла
$name_of_uploaded_file =
    basename($_FILES['uploaded_file']['name']);
    // например, index.php
    
//получаем расширение файла (без точки)
$type_of_uploaded_file =
     substr($name_of_uploaded_file,
   // позиция вхождения точки + 1
    strrpos($name_of_uploaded_file, '.') + 1);
$size_of_uploaded_file =
    $_FILES["uploaded_file"]["size"]/1024;
    //размер в KBs 

Как видите, информация о загруженном файле доступна через массив $_FILES.


Проверяем размер и тип расширения загруженного файла

Предположим, что получаемый файл должен быть изображением («jpg«, «jpeg«, «gif«, «bmp«) и не должен превышать 100 Kb. Тогда наш код будет выглядеть так:

PHP

//Настройки
$max_allowed_file_size = 100; // размер в  KB
$allowed_extensions = array("jpg", "jpeg", "gif", "bmp");
//Проверки
if($size_of_uploaded_file > $max_allowed_file_size )
{
$errors .= "\n Размер файла должен быть меньше $max_allowed_file_size";
}
//------ Проверяем расширение файла -----
$allowed_ext = false;
for($i=0; $i<sizeof($allowed_extensions); $i++)
{
// сравниваем строки, если = 0, то строки идентичны (без учета регистра)
  if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0)
  {
    $allowed_ext = true;
  }
}
if(!$allowed_ext)
{
$errors .= "\n Расширение файла не соответствует требуемому. ".
"Поддерживаются следующие расширения: ".implode(',',$allowed_extensions);
}

В вышеприведенном коде мы проверяем размер и тип файла. Максимально допустимый размер файла равен 100 KB ($max_allowed_file_size). Массив $allowed_extensions содержит названия всех допустимых расширений файла. Таким образом, расширение файла проходит проверку на соответствие значениям массива $allowed_extensions. При обнаружении ошибок переменной $error присваивается соответствующая запись.


Копируем загруженный файл

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

PHP

//копируем  временный файл в папку  uploads 

$path_of_uploaded_file = $upload_folder . $name_of_uploaded_file;


$tmp_path = $_FILES["uploaded_file"]["tmp_name"];


// был ли загружен файл при помощи HTTP POST
if(is_uploaded_file($tmp_path))
{
// если файл не скопирован, создаем ошибку
  if(!copy($tmp_path,$path_of_uploaded_file))
  {
    $errors .= '\n error while copying the uploaded file';
  }
}

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

Копируем загруженный файл в папку ‘uploads‘. Если вы хотите переименовать папку (uploads), обновите переменную $upload_folder.

Убедитесь, что папка ‘uploads‘ имеет права доступа 777. Файл сохранен на вашем сервере, и вы можете обратиться к нему в любой момент.


Отправляем письмо

Составим и отправим письмо на электронную почту администратора сайта (или кому хотите). Для отправки и компоновки письма будем использовать pear library (инструкцию по установке смотрите ниже). Pear классы PEAR::Mail и PEAR::Mail_Mime используются для отправки электронной почты с прикрепленными файлами.

Для начала мы должны подключить файлы pear library для этих классов:

PHP

include_once('Mail.php');
include_once('Mail_Mime/mime.php');

Ниже приведен код компоновки и отправки письма:

PHP

$message = new Mail_mime();
$message->setTXTBody($text);
$message->addAttachment($path_of_uploaded_file);
$body = $message->get();
$extraheaders = array("From"=>$from, 
     "Subject"=>$subject,"Reply-To"=>$visitor_email);
$headers = $message->headers($extraheaders);
$mail = Mail::factory("mail");
$mail->send($to, $headers, $body);

Класс Mail_mime() поможет в создании MIME послания. В приведенном выше коде мы создали объект Mail_mime, обновили тело письма ($message->setTXTBody($text);) и добавили прикрепленный файл ($message->addAttachment(file)).

Прежде чем использовать классы PEAR необходимо установить PEAR на вашем сервере. Вот быстрый способ установить PEAR:
Скачайте инсталлятор PEAR

http://pear.php.net/go-pear

Сохраните файл как «pear-installer.php«. Загрузите этот файл на ваш сервер в любой каталог. Затем пропишите путь к файлу в вашем браузере:
http://www.yourdomain.com/pear-installer.php
Появится веб-интерфейс для установки PEAR на вашем сайте. Следуйте инструкции по установке. После установки Pear, найдите и установите пакеты «mail» и «mail_mime«.


Простая форма с загрузкой, скачать

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *