За последние 24 часа нас посетили 22550 программистов и 1209 роботов. Сейчас ищут 672 программиста ...

PHPmailer и аттач файлов

Тема в разделе "Работа с почтой", создана пользователем spiritus_infernus, 5 сен 2016.

Метки:
  1. spiritus_infernus

    spiritus_infernus Новичок

    С нами с:
    14 май 2016
    Сообщения:
    14
    Симпатии:
    0
    Приветствую всех. Собственно потребовалось мне запилить форму обратной связи с возможностью отсылки не только формы, но и файлов вместе с её содержимым. Первую половину худо-бедно осилил, вторую - уже голова не работает. потому реквестую помощь.
    Вся эта конструкция состоит из вордпресса, материалайза и пхпмайлера, который шлёт письма через смтп гуглопочты.
    кусок файла, где происходит вся проблема.
    PHP:
    1. if (isset($_FILES['uploaded_file']) &&
    2. $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
    3. $mail->AddAttachment($_FILES['uploaded_file']['tmp_name'],
    4. $_FILES['uploaded_file']['name']);
    5. }
    тот же файл уже элементы дом:
    HTML:
    1.  
    2. <div class="file-field input-field col s12 m12 flex-row file-row">
    3. <input class="exo2bold hide-on-med-and-down" type="file" id="uploaded_file" name="uploaded_file[]" multiple>
    4. <button type="file" class="med-blue white-text btn-flat exo2reg hide-on-med-and-down">Выбрать файл</button>
    5.  
    перепробованы разные варианты и на встроенном в вп пхпмайле и на куче сторонних решений, взятых из основательного тисканья гугла по разным запросам о присоединении файлов к форме обратной связи. поэтмоу буду благодарен сведущим людям за добрые советы и рекомендации, на что обратить внимание, чтобы добиться искомого результата. за пинки в сторону мануалов, тоже буду благодарен, но желательно на максимально конкретные примеры, а не общее направление.
    https://github.com/PHPMailer/PHPMai...01df0/examples/send_multiple_file_upload.phps
    тут, например, я уже был. не едет.
    var_dump($_FILES) выдаёт массив из прикреплённого файла/файлов, но при запросе AddAttachment($_FILES['uploaded_file']['tmp_name'] - ругается на то, что нет доступа к файлам/файлы не найдены.
    спасибо за помощь заранее.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    HTML:
    1. <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 файл, не смог его выполнить.
     
    spiritus_infernus нравится это.
  3. spiritus_infernus

    spiritus_infernus Новичок

    С нами с:
    14 май 2016
    Сообщения:
    14
    Симпатии:
    0
    для выбора файлов. а кнопкой - чтобы конечному пользователю было понятно, что вот именно в неё и надо жать.
    совет попробую, результаты сообщу, спасибо.
     
  4. spiritus_infernus

    spiritus_infernus Новичок

    С нами с:
    14 май 2016
    Сообщения:
    14
    Симпатии:
    0
    либо я и с этой функцией что то очень сильно сделал не так, либо действительно файловая система на сервере закрыта для записи извне.
    PHP:
    1. $_uploads_dir = "/home/u710616/html/";
    2. move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $_uploads_dir); // add attachments
    3. foreach ($_FILES["uploaded_file"]["error"] as $key => $error) {
    4. if ($error == UPLOAD_ERR_OK) {
    5. $tmp_name = $_FILES["uploaded_file"]["tmp_name"][$key];
    6. $name = $_FILES["uploaded_file"]["name"][$key];
    7. move_uploaded_file($tmp_name, "$uploads_dir/$name");
    8. $mail->AddAttachment($tmp_name, "$uploads_dir/$name");
    9. $mail->AddAttachment($tmp_name,$name);
    10. }
    добавил вот это, результат такой же. что я мог сделать не так и как можно изменить ситуацию? возможно стоит делать дополнительные функции, на манер chmod на папку до перезаписи файлов в неё?
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Зачем два раза почти одно и тоже вызывать?

    Сделай
    PHP:
    1. var_export(move_uploaded_file($tmp_name, "$uploads_dir/$name"));
    чтобы узнать результат

    ошибки всё равно есть?
     
    spiritus_infernus нравится это.
  6. spiritus_infernus

    spiritus_infernus Новичок

    С нами с:
    14 май 2016
    Сообщения:
    14
    Симпатии:
    0
    малость нубоват в пхп, да и пытаюсь пока в режиме отладки вызвать нужную процедуру всеми доступными способами, чтобы потом методом исключения убрать ненужные.
    после
    PHP:
    1. var_export(move_uploaded_file($tmp_name, "$uploads_dir/$name"));
    результат тот же. письмо идёт, аттача нет.
    на всякий случай приложу дамп
    PHP:
    1. var_dump($_FILES)
    вдруг поможет.
    Код (Text):
    1. 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) } } }
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    надо результат var_dump/var_export копировать из исходного кода браузера, там он отформатирован, читать легче.
    Там в $_FILES один файл не загрузился, это не критично, но странно.

    Ещё похоже у тебя опечатка, нету нижнего подчёркивания:
    PHP:
    1. $_uploads_dir = "/home/u710616/html/";
    PHP:
    1. "$uploads_dir/$name"
    Тут у тебя путь с двумя /: /home/u710616/html//example.txt
    PHP:
    1. "$uploads_dir/$name"
    Это исправил?
     
    spiritus_infernus нравится это.
  8. spiritus_infernus

    spiritus_infernus Новичок

    С нами с:
    14 май 2016
    Сообщения:
    14
    Симпатии:
    0
    сейчас попробую предложенное. а нужно ли в внешней директории прописывать доступ через хтаксесс, или достаточно в панели управления открыть доступ к папке, или по дефолту должно сработать? по дефолту права стоят 755, это может иметь значение? может причина странного поведения в этом?
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    на папку можно ещё chmod для записи задать, но всё зависит от настроек сервера, тех поддержка может подсказать.
    Можно её спросить: Какой должен быть chmod на папке, чтобы с помощью PHP можно было в ней создавать файлы и и редактировать их.

    имеет, этого достаточно, но всё может быть, на время можно 777 поставить, счастливое число