Приветствую всех. Собственно потребовалось мне запилить форму обратной связи с возможностью отсылки не только формы, но и файлов вместе с её содержимым. Первую половину худо-бедно осилил, вторую - уже голова не работает. потому реквестую помощь. Вся эта конструкция состоит из вордпресса, материалайза и пхпмайлера, который шлёт письма через смтп гуглопочты. кусок файла, где происходит вся проблема. PHP: if (isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) { $mail->AddAttachment($_FILES['uploaded_file']['tmp_name'], $_FILES['uploaded_file']['name']); } тот же файл уже элементы дом: HTML: <div class="file-field input-field col s12 m12 flex-row file-row"> <input class="exo2bold hide-on-med-and-down" type="file" id="uploaded_file" name="uploaded_file[]" multiple> <button type="file" class="med-blue white-text btn-flat exo2reg hide-on-med-and-down">Выбрать файл</button> перепробованы разные варианты и на встроенном в вп пхпмайле и на куче сторонних решений, взятых из основательного тисканья гугла по разным запросам о присоединении файлов к форме обратной связи. поэтмоу буду благодарен сведущим людям за добрые советы и рекомендации, на что обратить внимание, чтобы добиться искомого результата. за пинки в сторону мануалов, тоже буду благодарен, но желательно на максимально конкретные примеры, а не общее направление. https://github.com/PHPMailer/PHPMai...01df0/examples/send_multiple_file_upload.phps тут, например, я уже был. не едет. var_dump($_FILES) выдаёт массив из прикреплённого файла/файлов, но при запросе AddAttachment($_FILES['uploaded_file']['tmp_name'] - ругается на то, что нет доступа к файлам/файлы не найдены. спасибо за помощь заранее.
HTML: <button type="file" class="med-blue white-text btn-flat exo2reg hide-on-med-and-down">Выбрать файл</button> Для чего это? Возможно так настроен хостинг, что к tmp (временной) папке отсутствует доступ, злые они. Попробуй тогда https://secure.php.net/manual/ru/function.move-uploaded-file.php переместить файл к себе в папку, а уже потом делай его atach, после отправки письма, уже удаляй этот файл https://secure.php.net/manual/ru/function.unlink.php Файл перемещай выше папки с сайтом или закрой через .htaccess папку для просмотра и доступа куда загружаешь файлы, чтобы если кто-то загрузит php файл, не смог его выполнить.
для выбора файлов. а кнопкой - чтобы конечному пользователю было понятно, что вот именно в неё и надо жать. совет попробую, результаты сообщу, спасибо.
либо я и с этой функцией что то очень сильно сделал не так, либо действительно файловая система на сервере закрыта для записи извне. PHP: $_uploads_dir = "/home/u710616/html/"; move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $_uploads_dir); // add attachments foreach ($_FILES["uploaded_file"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["uploaded_file"]["tmp_name"][$key]; $name = $_FILES["uploaded_file"]["name"][$key]; move_uploaded_file($tmp_name, "$uploads_dir/$name"); $mail->AddAttachment($tmp_name, "$uploads_dir/$name"); $mail->AddAttachment($tmp_name,$name); } добавил вот это, результат такой же. что я мог сделать не так и как можно изменить ситуацию? возможно стоит делать дополнительные функции, на манер chmod на папку до перезаписи файлов в неё?
Зачем два раза почти одно и тоже вызывать? Сделай PHP: var_export(move_uploaded_file($tmp_name, "$uploads_dir/$name")); чтобы узнать результат ошибки всё равно есть?
малость нубоват в пхп, да и пытаюсь пока в режиме отладки вызвать нужную процедуру всеми доступными способами, чтобы потом методом исключения убрать ненужные. после PHP: var_export(move_uploaded_file($tmp_name, "$uploads_dir/$name")); результат тот же. письмо идёт, аттача нет. на всякий случай приложу дамп PHP: var_dump($_FILES) вдруг поможет. Код (Text): array(1) { ["uploaded_file"]=> array(5) { ["name"]=> array(2) { [0]=> string(14) "icon_apple.jpg" [1]=> string(0) "" } ["type"]=> array(2) { [0]=> string(10) "image/jpeg" [1]=> string(0) "" } ["tmp_name"]=> array(2) { [0]=> string(14) "/tmp/php5TyAZy" [1]=> string(0) "" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(4) } ["size"]=> array(2) { [0]=> int(9479) [1]=> int(0) } } }
надо результат var_dump/var_export копировать из исходного кода браузера, там он отформатирован, читать легче. Там в $_FILES один файл не загрузился, это не критично, но странно. Ещё похоже у тебя опечатка, нету нижнего подчёркивания: PHP: $_uploads_dir = "/home/u710616/html/"; PHP: "$uploads_dir/$name" Тут у тебя путь с двумя /: /home/u710616/html//example.txt PHP: "$uploads_dir/$name" Это исправил?
сейчас попробую предложенное. а нужно ли в внешней директории прописывать доступ через хтаксесс, или достаточно в панели управления открыть доступ к папке, или по дефолту должно сработать? по дефолту права стоят 755, это может иметь значение? может причина странного поведения в этом?
на папку можно ещё chmod для записи задать, но всё зависит от настроек сервера, тех поддержка может подсказать. Можно её спросить: Какой должен быть chmod на папке, чтобы с помощью PHP можно было в ней создавать файлы и и редактировать их. имеет, этого достаточно, но всё может быть, на время можно 777 поставить, счастливое число