Информация к новости
  • Просмотров: 1531
  • Автор: sulicompany
  • Дата: 28-05-2012, 23:16
 (голосов: 0)
28-05-2012, 23:16

Форма обратной связи с аттачами

Категория: Программирование » HTML


Итак, приступим к созданию простой формы, основная функция которой загружать файлы определенного типа и размера в определенную папку на сервере.

Шаг 1.

Для начала нам нужно создать форму для загрузки файлов на сервер. Код, который будет отвечать за форму, будет выглядеть примерно так:

<form action="./upload.php" method="post" enctype="multipart/form-data">
<p><input type="file" name="userfile" id="file"></p>
<p><input type="submit" value="Загрузить файл"></p>
</form>

Обработчиком этой формы будет фаил upload.php. Т.к. мы собираемся передавать через форму файлы, то атрибутenctype нужно обязательно установить в значение multipart/form-data.

Форма, которую мы только что создали будет выглядеть примерно так:

Шаг 2.

Теперь мы можем приступать к созданию обработчика, которым у нас является файл upload.php. Начнем мы с того, что пропишем допустимые типы файлов, которые можно будет загружать на наш сервер. Этим мы защитим себя от угрозы, которую таят в себе некоторые типы файлов, такие как .php, .pl и т.д.

<?php
$allowed_filetypes = array('.jpg','.gif','.bmp','.png'); // Здесь мы перечисляем допустимые типы файлов
$max_filesize = 524288; // Максимальный размер загружаемого файла в байтах (в данном случае он равен 0.5 Мб).
$upload_path = './files/'; // Место, куда будут загружаться файлы (в данном случае это папка 'files').
$filename = $_FILES['userfile']['name']; // В переменную $filename заносим точное имя файла (включая расширение).
$ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // В переменную $ext заносим расширение загруженного файла.
// Сверяем полученное расширение со списком допутимых расширений, которые мы определили в самом начале. Если расширение загруженного файла не входит в список разрешенных, то прерываем выполнение программы и выдаем соответствующее сообщение.
if(!in_array($ext,$allowed_filetypes))
die('Данный тип файла не поддерживается.');
// Теперь проверим размер загруженного файла и если он больше максимально допустимого, то прерываем выполнение программы и выдаем сообщение.
if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)
die('Фаил слишком большой.');
// Проверяем, доступна ли на запись папка, определенная нами под загрузку файлов (папка files). Если вдруг недоступна, то выдаем сообщение, что на папку нужно поставить права доступа 777.
if(!is_writable($upload_path))
die('Невозможно загрузить фаил в папку. Установите права доступа - 777.');
// Загружаем фаил в указанную папку.
if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename))
echo 'Ваш фаил успешно загружен <a href="' . $upload_path . $filename . '">смотреть</a>';
else
echo 'При загрузке возникли ошибки. Попробуйте ещё раз.';

?>

Ещё один момент, который Вам стоит знать. PHP по умолчанию не позволяет загружать файлы больше чем 2 Мб. Чтобы увеличить этот показатель, Вам нужно подправить параметры set upload_max_filesize и post_max_size в файле php.ini.



Отправка письма с вложением

<HTML>
<HEAD>
<TITLE>Отправка сообщения с вложением</TITLE>
</HEAD>
<BODY>
<H3> <center><font color="#1E90FF">Отправка сообщения с вложением</font></H3>
<center>
<table width="1" border="0">
<form action="simple_mail.php" enctype="multipart/form-data" method="post">
<tr><td width="50%">To:</td><td align="right"><input type="text" name="mail_to" maxlength="32"></td></tr>
<tr><td width="50%">Subject:</td><td align="right"><input type="text" name="mail_subject" maxlength="64"></td></tr>
<tr><td colspan="2">Сообщение:<br><textarea cols="50" rows="8" name="mail_msg"></textarea></td>
<tr><td width="50%">Photo:</td><td align="right"><input type="file" name="mail_file" maxlength="64"></td></tr>
</tr><tr><td colspan="2"><input type="submit" value="Отправить"></td></tr>
</form>
</table>
</center>
</BODY>
</HTML>


Обработчик simple_mail.php HTML-формы index.php может выглядеть следующим образом

Обработчик simple_mail.php
<?php
  if(empty($_POST['mail_to'])) exit("Введите адрес получателя");
  // проверяем правильности заполнения с помощью регулярного выражения
  if (!preg_match("/^[0-9a-z_][email protected][0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to'])) exit("Введите адрес в виде [email protected]");
  $picture = "";
  // Если поле выбора вложения не пустое - закачиваем его на сервер
  if (!empty($_FILES['mail_file']['tmp_name']))
  {
    // Закачиваем файл
    $path = $_FILES['mail_file']['name'];
    if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path;
  }
  $thm = $_POST['mail_subject'];
  $msg = $_POST['mail_msg'];
  $mail_to = $_POST['mail_to'];
  // Отправляем почтовое сообщение
  if(empty($picture)) mail($mail_to, $thm, $msg);
  else send_mail($mail_to, $thm, $msg, $picture);
  // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon)
  function send_mail($mail_to, $thema, $html, $path)  
  { if ($path) {  
    $fp = fopen($path,"rb");  
    if (!$fp)  
    { print "Cannot open file";  
      exit();  
    }  
    $file = fread($fp, filesize($path));  
    fclose($fp);  
    }  
    $name = "file.ext"; // в этой переменной надо сформировать имя файла (без всякого пути)  
    $EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём
    $boundary     = "--".md5(uniqid(time()));  // любая строка, которой не будет ниже в потоке данных.  
    $headers    = "MIME-Version: 1.0;$EOL";  
    $headers   .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL";  
    $headers   .= "From: [email protected]";  
      
    $multipart  = "--$boundary$EOL";  
    $multipart .= "Content-Type: text/html; charset=utf-8$EOL";  
    $multipart .= "Content-Transfer-Encoding: base64$EOL";  
    $multipart .= $EOL; // раздел между заголовками и телом html-части
    $multipart .= chunk_split(base64_encode($html));  

    $multipart .=  "$EOL--$boundary$EOL";  
    $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL";  
    $multipart .= "Content-Transfer-Encoding: base64$EOL";  
    $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL";  
    $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла
    $multipart .= chunk_split(base64_encode($file));  

    $multipart .= "$EOL--$boundary--$EOL";  
      
        if(!mail($mail_to, $thema, $multipart, $headers))  
         {return False;           //если не письмо не отправлено
      }  
    else { //// если письмо отправлено
    return True;  
    }  
  exit;  
  }
?>