Вебстудия Андрея Москалюкова :: ООО "Интернет-информация-бизнес"

Создание сайтов

Сайты ...

создание, обслуживание и продвижение для бизнеса, бюджета, частникам.

Контакты

телефон: +7 978 7316680
email: aminfo@ya.ru

Отправка файлов через формуПеред начинающим программистом на PHP часто встает задача передать на сервер файл через форму. На сервере принятый файл обрабатывется, либо переносится в определенную папку, либо отправляется электронной почтой адресату, либо разбирается, и так далее и тому подобное.

В этой статье рассмотрим ситуацию с отправкой файла электронной почтой стандартной функцией mail().

 

Создадим простую форму.

Имя отправителя:
Прикрепить файл:

Код формы:

<form ENCTYPE="multipart/form-data" name="form1" method="post" action="<?php echo $PHP_SELF; ?>">
Имя отправителя: <input type="text" name="username" /><br />
Прикрепить файл: <input type="file" name="fileup" /><br />
<input name="" type="submit" value="Отправить" />
</form>

И сразу небольшие пояснения. Если вы хотите отправить файл, то в форме необходимо установить аттрибут enctype в значение "multipart/form-data", в противном случае файлы отправляться не будут. Этот атрибут определяет метод кодирования данных и по умолчанию установлен в "application/x-www-form-urlencoded".

В нашем случае, отправка данных формы происходит методом post (что указано в форме: method="post") с помощью тегов input разных типов. Тег input типа file - отправляет файл.

Тег input наверное самый распространенный тег формы, имеющий несколько типов. В нашей форме присутствует еще и тег input типа text, который принимает и передает текстовое значение. Кнопка "Отправить", это тоже тег input типа submit.

Конструкция <?php echo $PHP_SELF; ?>, говорит о том, что в качестве обработчика формы выступает сам этот файл. Это же может быть записано еще и таким способом <?php echo $_SERVER ['PHP_SELF']; ?>. В любом случае $php_self и $SERVER['PHP_SELF'] - суперглобальные переменные, ввод которых необходимо проверять. Поэтому рекомендую использовать несколько измененную конструкцию <?php echo htmlspecialchars($PHP_SELF, ENT_QUOTES)?>, в которой ввод php_self проходит через функцию htmlspecialchars ().

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

Текстовые значения формы тегов input типа text, password, hidden, radio, а также тегов textarea и select принимаются на сервере через суперглобальные массивы $_POST или $_GET (в зависимости от указаний содержащихся в форме) выражением типа

$username = htmlspecialchars(stripslashes($_POST['username']), ENT_QUOTES).

В этом выражении присутствуют фунции php htmlspecialchars и stripslashes. Первая преобразует специальные символы в HTML сущности. Например, '&' (амперсанд) преобразуется в '&amp;', '<' (знак "меньше чем") преобразуется в '&lt;'. Вторая удаляет экранирующие бэкслэши. (\' преобразуется в ', и т.д.).

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

$_FILES['fileup']['name'] - имя переданного файла
$_FILES['fileup']['tmp_name'] - временное имя файла на сервере
$_FILES['fileup']['type'] - тип принятого файла
$_FILES['fileup']['size'] - размер файла в байтах
$_FILES['fileup']['error'] - код ошибки

Принять файл на стороне сервера можно например так:

if ( isset ($_FILES['userfile'])) {
$file_type = $_FILES['userfile']['type'];
$file_size = $_FILES['userfile']['size'];
$file_error = $_FILES['userfile']['error'];
$file_name_new = time().".zip";
$file_name_new_full = $_SERVER['DOCUMENT_ROOT']."/".$file_name_new;
if ($file_type == "application/x-zip-compressed") { copy ( $_FILES['userfile']['tmp_name'], $file_name_new_full ); };
}

Сначала проверяется наличие принятого файла, а затем переменным присваиваем значения с данными файла, которые позже можно использовать для различных проверок. Мы проверим тип принятого файла. В нашем случае предполагается, что принимаемый файл должен являться zip архивом. Принятый файл (если он имеет тип zip) копируется с новым именем в корневую папку сайта. При обработке файла надо помнить, что временный файл будет автоматически удален после окончания работы скрипта, а скопированный файл после обработки надо будет удалить самостоятельно чтобы "не засорять" сервер.

Данные приняты. Теперь надо послать принятый файл по электронной почте.

Для отправки будем использовать стандартную php функцию mail(), которая имеет формат: mail("кому","тема","тело письма", "заголовки");

Подготовим данные. В качестве значения "кому" выступает правильный адрес электронной почты, например: "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.". Тема и тело письма - обычные текстовые данные, причем тема в виде простого текста, а тело письма может быть в виде текста html

$subject = "Вам отправлен файл";
$body = "<style type=text/css> .text { font-family: Verdana, Arial, Helvetica, sans-serif; font-size:13px; color:#1e445b;line-height:18px; }</style><div class='text'>Вам отправлен файл<br /><br />Администрация сайта</div>";

Подготовим заголовки для письма.

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

$header = "From: no-reply@".$_SERVER['HTTP_HOST']."\r\nContent-Type: text/html; charset='windows-1251'\r\nContent-Transfer-Encoding: 8bit\r\n";

Здесь указываем от кого письмо (From: ), тип текста письма и его кодировка (Content-Type: text/html; charset='windows-1251') и количество бит для кодирования символов (Content-Transfer-Encoding: 8bit). Для кириллических кодировок (koi8-r, koi8-u, windows-1251, iso-8859-5, cp866) указание количества бит является крайне желательным, если вы не хотите получать знаки вопроса вместо текста. Код \r\n служит обозначение кодов "возврата каретки" и "переноса строки" (так обозначается конец строки в windows)

Хотите знать больше? Нажмите "Нравится"

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

$f = fopen($file_name_new_full,"rb"); // Открываем и читаем бинарно файл
$un = strtoupper(uniqid(time()));
$body = "------------".$un."\r\nContent-Type: text/html; charset='koi8-r'\r\nContent-Transfer-Encoding: 8bit\r\n\r\n". // Отбивается пустая строка !!!
"<style type=text/css> .text { font-family: Verdana, Arial, Helvetica, sans-serif; font-size:13px; color:#1e445b;line-height:18px; }</style><div class='text'>Вам отправлен файл<br /><br />Администрация сайта</div>".
"\r\n------------".$un."\r\nContent-Type: application/octet-stream;name=\"$file_name_new\"\r\nContent-Transfer-Encoding:base64\r\nContent-Disposition:attachment;filename=".$file_name_new."\r\n\r\n".chunk_split(base64_encode(fread($f,filesize($file_name_new_full))))."\r\n";
$headers = "From: ".$from."\r\nReply-To: ".$from."\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"----------".$un."\"\r\n";

Осталось только отправить письма и удалить принятый файл.

$sucess = mail("Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.", $subject, $body, $headers);
unlink ($file_name_new_full);

Функция mail() возвращает логическое значение true или false в зависимости от результата отправки письма.

Скачать пример можно здесь.

Если Вам помогла эта статья, можете выразить свою благодарность поставив на нее ссылку.

Комментарии  

0 # Отправка файлов через формуЕлена 19.08.2015 21:01
Здравствуйте, а у меня пример не работает... При нажатии на кнопку отправить у меня выводится то, что страница недоступна, передается вот это http://localhost/%3C?username=Elena&fileup=C%3A%5CWebServers%5Chome%5Ctest2.ru%5Cwww%5Cindex.html
Ответить | Ответить с цитатой | Цитировать
+5 # RE: Отправка файлов через формуАртем 05.01.2013 14:15
Прыгал до потолка!!!!!!!! !!!!!!!!!! :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
Ответить | Ответить с цитатой | Цитировать
+2 # RE: Отправка файлов через формуИгорь 23.05.2012 09:42
Спасибо! Перерыл кучу инфо в сети, везде используют класс PHPMailer. Здесь нашел то что надо, все лаконично и понятно.
Ответить | Ответить с цитатой | Цитировать
+6 # RE: Отправка файлов через формуanonymous 06.05.2012 17:08
Спасибо, хорошая статься, как раз то что искал.
Ответить | Ответить с цитатой | Цитировать
+1 # RE: Отправка файлов через формуnikolay 30.03.2012 11:11
Ссылка "Скачать пример" не работает. Сам пример тоже - собрал его из цитат в статье, в той же последовательно сти.
Ответить | Ответить с цитатой | Цитировать
+1 # RE: Отправка файлов через формуАндрей Москалюков 30.03.2012 11:42
Цитирую nikolay:
Ссылка "Скачать пример" не работает.

Приношу извинения за неработающую ссылку. Исправил, теперь работает.
Цитирую nikolay:
Сам пример тоже - собрал его из цитат в статье, в той же последовательности.

Пример проверил - работает
Ответить | Ответить с цитатой | Цитировать
+4 # RE: Отправка файлов через формуАндрей 15.01.2012 16:56
Интересная статья!спасибо. Еще хотелось бы спросить в как сделать 2 поля в Форме для отправки например двух разных файлов?
для примера в одно поле загрузка картинки во второе аудио файла
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Защитный код
Обновить

 

Новые комментарии