Сообщение от drkrol
|
Как это гикнуть на мой подход?
|
Да просто - загрузят вам файлов по размеру, за который вам хостер ваш может и по шапке дать. Вам ведь сказано было - так нельзя. А что от вас? Ну почти - "работает да и хрен с ним".
Первым делом, это нужно в панели управления узнать разрешения на почту, обычно это ограничения на количество сообщений отправляемых за единицу времени и на размер почтового отправлений. Из этого размера и нужно исходить, то есть еще на клиенте проверять размер загружаемых файлов, и по приему формы сервером опять проверять, и обязательно!
Сам сервер накладывает ограничения на загрузку файлов, которые тоже можно узнать в панели. Если панель не дает об этом полной информации, то это можно получить таким образом:
//макс. размер POST данных в МБ,
//этот размер должен превышать весь объем данных формы, включая и файлы
ini_get('post_max_size')+0;
//макс. размер загружаемого файла МБ
ini_get('upload_max_filesize')+0;
//количество загружаемых файлов, контролируется начиная с версии 5.2.12
ini_get('max_file_uploads');
Эти параметры также нужно передать на клиента, проверяя по ним загрузку файлов.
На сервере, тем более отправляя почту, нужно не
"Это уже другой вопрос", а первостепенный вопрос, ибо вы не проверяя загружено или нет, плюхаете на почту, не проверяя ошибок, а нужно отправлять только в том случае, если их нет. Если они есть, то об этом должен знать клиент и
причину ошибки. А для того чтобы не хвататься сразу за формирование сообщения, а проверить отсутствие ошибок загрузки, достаточно получить ключи массива $_FILES['error'] отличные от ноля:
if(!$e = array_diff($_FILES['fileFF']['error'], array(0))) {
if(!$size = array_sum(array_column($_FILES['fileFF'], 'size')) < $sizemail) {
//нет ошибок загрузки, формируем сообщение
//загружая файлы с проверкой is_uploaded_file
} //иначе сообщаем клиенту - низзя
} //иначе $e содержит массив ошибок, сообщаем клиенту
//функция array_column() доступна начиная с версии 5.5.0
//если версия ниже, функцию можно заменить пользовательской
function arrayColumn($a, $i) {
return array_values(array_diff(array_map(function($v) use($i) {
return $v[$i];
}, $a), array(null)));
}
//имена файлов всегда нужно обрабатывать как:
$filename = basename($_FILES['fileFF']['name']);
//пусть для письма как текст это и не страшно
//просто это должно стать привычкой
На клиенте эти параметры можно проверить получая соответствующие свойства массива files поля file. Как это делается и на этом форуме не раз приводилось, да и в сети об этом полно.
Тему почтового сообщения кодируют:
$subject ='=?utf-8?b?' . base64_encode('Заполнена контактная форма с '.$_SERVER['HTTP_REFERER']) . '?=';
//тоже самое делать и с данными для поля From, если к адресу добавляют текст
$headers = 'From: =?utf-8?B?' . base64_encode($data) . '?= <' .$email. '>' . PHP_EOL;