• Открыть меню    

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

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