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

Параметры запроса должны быть:
$.ajax({
    type: "POST",
    url: "mail.php",
    contentType: false,
    processData: false,
    data: new FormData(this)
})
//далее


Перед тем как оперировать загруженным, нужно проверять ключ 'error' массива $_FILES, и если он равен 0, тогда файлом можно оперировать, то есть if(!$_FILES['file']['error']) { код дальнейшей проверки условий, если есть, и операции над файлом }. Файл может загрузиться и массив будет иметь информацию о нем, но при этом файл может быть загружен не полностью по какой либо причине, и $_FILES['error'] будет содержать номер этой ошибки.

Поле выбора файла в форме имеет имя file, а в массиве $_FILES почему то ищется filename, а должно быть $_FILES['file']['tmp_name'] и т.п..

move_uploaded_file($_FILES['file']['tmp_name'], $file); - это означает, что файл будет загружен в текущую директорию, то есть ту в которой находится скрипт обработчик принимающий форму. Каталог, в котом находится исполняемые файлы ни в коем случае не должен иметь прав на запись по умолчанию. Если такая необходимость загружать в него файла, то перед загрузкой нужно дать такие права, а после загрузки вновь запретить (почитайте о CHMOD). Очень многое что приходит на сервер может быть подделано и $_FILES['file']['name'] в том числе. Если в этом поле будет путь, а не имя файла, а файл будет исполняемый, то его вам загрузят и запустят, последствия этого могут быть фатальными для сайта. Если используется имя оригинального файла, то обязательна операция basename($_FILES['file']['name']), а если загружается в каталог скриптов, то имя файла не используется вообще. Кроме этого, если для загрузки разрешены к примеру только файлы изображений, то такие файлы легко проверить на фейк.

Если загруженный файл только для почтового отправления, то его не обязательно сохранять в директории сайта, он и так доступен на сервере как $_FILES['file']['tmp_name'], его и нужно прикреплять к почте. Но для этого почтовое отправление должно иметь иную структуру тела, нежели у вас. Поищите в сети "отправка почты с вложением", нет времени все разжевывать.

$pagetitle = "Новое сообщение с сайта \"$sitename\""; - это тема письма у вас, а на нее не действует объявленная кодировка письма, тему нужно кодировать (также найдете в сети, там просто).

Последний раз редактировалось laimas, 13.12.2018 в 17:04.
Ответить с цитированием