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