Показать сообщение отдельно
  #6 (permalink)  
Старый 25.09.2015, 15:16
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от 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;

Последний раз редактировалось laimas, 25.09.2015 в 15:31.
Ответить с цитированием