Используйте загруженный файл непосредственно из его расположения tmp

#php #email #file-upload

#php #Адрес электронной почты #загрузка файла

Вопрос:

У меня есть небольшая форма, в которой пользователь загружает файл. Что я хочу сделать, так это отправить файл по электронной почте непосредственно из его расположения tmp, не перемещая его сначала; потому что нет необходимости хранить его на сервере. Поскольку PHP удаляет файл из папки tmp после выполнения скрипта, это было бы идеально.

Я использую фантастический класс электронной почты Mime-сообщений Мануэля Лемоса и могу сделать это:

 $tmp_file = '/www/vhosts/mysite.be/subdomains/subdomainname/httpdocs'.$_FILES['attachment']['tmp_name'];
$attachment=array(
    "FileName" => $_FILES['attachment']['name'],
    "Content-Type" => $_FILES['attachment']['type'],
    "Data" => $tmp_file,
    "Disposition" => "attachment"
);
$email_message->AddFilePart($attachment); 
 

Проблема в том, что я, похоже, не могу извлечь файл из его расположения tmp. Я нахожусь в системе общего хостинга.

Может ли кто-нибудь поделиться точками зрения / ответами? С нетерпением жду ваших мнений.

PS: Пожалуйста, обратите внимание, что нет никаких проблем с ограничениями загрузки / тайм-аутами / enctype…

Комментарии:

1. Вы пытались проверить, есть ли какая-либо проблема, связанная с загруженным файлом? Например, путем регистрации is_readable() ?

2. Большое спасибо за это. Файл должен быть читаемым (согласно is_readable()). Проблема в том, что скрипт сообщает мне: «не удалось открыть файл части»

3. Я изменил скрипт следующим образом FileName" => $_FILES['attachment']['tmp_name'] , и теперь он работает, проблема в том, что теперь он отправляет файл с именем glkjmlksjf и без расширения. Есть ли способ решить эту проблему?

4. Скорее всего, это недостаток используемой вами библиотеки. Я не собираюсь вникать в это. Однако я бы посоветовал вам использовать более известную библиотеку, например zetaMail из zetaComponents .

5. Большое спасибо за ваши идеи и советы. Я буду изучать zetaComponents. Конечно, я понимаю, что о переходе в mailclass, который я использую, не может быть и речи.

Ответ №1:

Вам не нужно указывать каталог для $tmp_file , поскольку tmp_name уже содержит это. Также проверьте, существует ли файл для его отладки.

 $tmp_file = $_FILES['attachment']['tmp_name'];

if (file_exists($tmp_file)) {
     echo "yay";
}
else {
     echo "nay :-(";
}
 

Посмотрите, что произойдет после этого.

Комментарии:

1. Спасибо, вы правы. Определять $tmp_file не обязательно. Теперь я понял, что файл существует. Теперь появляется другая проблема, как описано в третьем комментарии к вопросу. Не могли бы вы взглянуть?

2. Опять же, отладьте его, повторив $_FILES['attachment']['name'] , если это правильное имя файла, вам нужно будет вернуться к классу, из которого вы его получили, и посмотреть, как это работает, поскольку, похоже, он не используется FileName (возможно, массив вложений сконструирован неправильно).

3. Спасибо! Более глубокое исследование показывает мне, что файл отправляется по почте с его временным именем, но с расширением. Я могу жить с этим. Он функционирует в своем текущем виде благодаря вам и Тиллю Хельге Хельвигу. Хорошего дня.