#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. Спасибо! Более глубокое исследование показывает мне, что файл отправляется по почте с его временным именем, но с расширением. Я могу жить с этим. Он функционирует в своем текущем виде благодаря вам и Тиллю Хельге Хельвигу. Хорошего дня.