Открыть меню    

Как создать форму обратной связи с возможностью загрузки и отправки файла на почту 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".

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

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

Источник

Комментарии к статье

аватарка пользователя
2012-09-19
выживший

выложите исходники, лень читать

аватарка пользователя
2012-09-19
dnzl

в статье есть ссылка "источник", скачайте оттуда

аватарка пользователя
2012-10-23
Алексей

А куда во всем этом описании делся код php для полей, имя, email, сообщение, потерялся что ли?)

аватарка пользователя
2012-10-23
dnzl

акцент в статье на файлы

аватарка пользователя
2012-11-24
миша

а как скопировать скрипт

аватарка пользователя
2012-11-24
dnzl

приложил архив

аватарка пользователя
2013-01-03
Денис

Спасибо!

аватарка пользователя
2013-09-20
Сергей

Как сделать так чтобы текст написанный кирилицей в сообщении, приходил в письме в читаемом виде? Сейчас в письме приходят иероглифы.

аватарка пользователя
2013-09-20
dnzl

если на сайте кириллица, то попробуйте для преобразовать текст в utf-8, через iconv() и отсылать

аватарка пользователя
2013-09-23
Андрей

В архиве есть файл validator31.js как его использовать? По коду понял, что нужен для проверки введенных данных, но по факту никакой проверки нет, ввожу в поле e-mail любую строку и никаких предупреждений не выводится.

аватарка пользователя
2013-11-07
Оксана

Скажите, а как обезопаситься от вируса? Например, злоумышленник шлет нам картинку. а к ней подцеплен вирус.

аватарка пользователя
2013-12-09
Вася

Дякую за форму! Попробую поставити на сайт.

аватарка пользователя
2014-03-12
Red

А можно сделать что бы ошибка при проверка формы появлялась возле поля или сверху формы, а не в отдельном окошке?

аватарка пользователя
2014-03-28
Masjanja

Почему у меня не устанавливается?
От такое выдает браузер "Warning: include_once(Mail.php) [function.include-once]: failed to open stream: No such file or directory in /home/virtwww/w_orch9f1_90794949/http/php-email-form-attachment/send-email-form.php on line 4

Warning: include_once() [function.include]: Failed opening 'Mail.php' for inclusion (include_path='.:') in /home/virtwww/w_orch9f1_90794949/http/php-email-form-attachment/send-email-form.php on line 4

Warning: include_once(Mail_Mime/mime.php) [function.include-once]: failed to open stream: No such file or directory in /home/virtwww/w_orch9f1_90794949/http/php-email-form-attachment/send-email-form.php on line 5

Warning: include_once() [function.include]: Failed opening 'Mail_Mime/mime.php' for inclusion (include_path='.:') in /home/virtwww/w_orch9f1_90794949/http/php-email-form-attachment/send-email-form.php on line 5"

аватарка пользователя
2014-04-10
Сергей

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

аватарка пользователя
2014-06-01
Артур

Здравствуйте, dnzl. Подскажите, пожалуйста, а как сделать, чтобы уведомление это приходило не на почту, а смс-кой на телефон?

аватарка пользователя
2014-06-01
dnzl

Артур, не знаю, я верстальщик пока что

аватарка пользователя
2016-08-04
obmentorg.ru

Спасибо, пригодилось!