Как создать форму обратной связи с возможностью загрузки и отправки файла на почту 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
".
Простая форма с загрузкой, скачать
Архив содержит простую форму с отправкой загруженного файла на почту.
Источник
Комментарии к статье
выложите исходники, лень читать
в статье есть ссылка "источник", скачайте оттуда
А куда во всем этом описании делся код php для полей, имя, email, сообщение, потерялся что ли?)
акцент в статье на файлы
а как скопировать скрипт
приложил архив
Спасибо!
Как сделать так чтобы текст написанный кирилицей в сообщении, приходил в письме в читаемом виде? Сейчас в письме приходят иероглифы.
если на сайте кириллица, то попробуйте для преобразовать текст в utf-8, через iconv() и отсылать
В архиве есть файл validator31.js как его использовать? По коду понял, что нужен для проверки введенных данных, но по факту никакой проверки нет, ввожу в поле e-mail любую строку и никаких предупреждений не выводится.
Скажите, а как обезопаситься от вируса? Например, злоумышленник шлет нам картинку. а к ней подцеплен вирус.
Дякую за форму! Попробую поставити на сайт.
А можно сделать что бы ошибка при проверка формы появлялась возле поля или сверху формы, а не в отдельном окошке?
Почему у меня не устанавливается?
От такое выдает браузер "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"
немогу понять что и куда прописывать и что куда вставлять чтобы можно было загружать файлы в Обратную связь и чтобы все приходило на почту ... что писать есть а куда это все - не понимаю ..
Здравствуйте, dnzl. Подскажите, пожалуйста, а как сделать, чтобы уведомление это приходило не на почту, а смс-кой на телефон?
Артур, не знаю, я верстальщик пока что
Спасибо, пригодилось!