Почему мой скрипт PHPmailer не работает для получения / сохранения файлов? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть форма HTML / javascript, написанная с циклом для загрузки неограниченного количества файлов с именами = "file1", "file2" и т. Д.(i ++)

Так что теперь у меня есть PHP-форма для ее обработки (получить все файлы, сохранить во временную папку «uploads» и отправить по электронной почте в виде вложений с помощью phpmailer).

<?php
require("class.phpmailer.php");
//Variables Declaration
$name = "the Submitter";
$email_subject = "Images Attachment";
$Email_msg ="A visitor submitted the following :\n";
$Email_to = "you@yourSite.com"; // the one that recieves the email
$email_from = "someone@someone.net";
$dir = "uploads/$filename";
chmod("uploads",0777);
$attachments = array();

uploadFile();
//

//
//==============upload File Function============\\
//
function uploadFile() {
global $attachments;
while(list($key,$value) = each($_FILES[images][name]))
{
//
if(!empty($value))
{
$filename = $value;
//the Array will be used later to attach the files and then remove them from server ! array_push($attachments, $filename);
$dir = "uploads/$filename";
chmod("uploads",0777);
$success = copy($_FILES[images][tmp_name][$key], $dir);
}
//
}
//
if ($success) {
echo " Files Uploaded Successfully<BR>";
SendIt();
//
}else {
exit("Sorry the server was unable to upload the files...");
}
//
}
//
//==== PHP Mailer With Attachment Func ====\\
//
function SendIt() {
//
global $attachments,$name,$Email_to,$Email_msg,$email_subject,$email_from;
//
$mail = new PHPMailer();
$mail->IsSMTP();// send via SMTP
$mail->Host = "localhost"; // SMTP servers
$mail->SMTPAuth = false; // turn on/off SMTP authentication
$mail->From = $email_from;
$mail->FromName = $name;
$mail->AddAddress($Email_to);
$mail->AddReplyTo($email_from);
$mail->WordWrap = 50;// set word wrap
//now Attach all files submitted
foreach($attachments as $key => $value) { //loop the Attachments to be added ...
$mail->AddAttachment("uploads"."/".$value);
}
$mail->Body = $Email_msg."Name : ".$name."\n";
//
$mail->IsHTML(false);// send as HTML
$mail->Subject = $email_subject;
if(!$mail->Send())
{
echo "Message was not sent <p>";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
//
echo "Message has been sent";
// after mail is sent with attachments , delete the images on server ...
foreach($attachments as $key => $value) {//remove the uploaded files ..
unlink("uploads"."/".$value);
}
//
}
//
?>

Но по какой-то причине я получаю следующие ошибки:

Примечание: неопределенная переменная: имя файла в /usr/home/jak2234/public_html/new_form/phpmailerprocess.php в строке 10

Warning: chmod() [function.chmod]: Operation not permitted in /usr/home/jak2234/public_html/new_form/phpmailerprocess.php on line 11

Notice: Use of undefined constant images - assumed 'images' in /usr/home/jak2234/public_html/new_form/phpmailerprocess.php on line 22

Notice: Use of undefined constant name - assumed 'name' in /usr/home/jak2234/public_html/new_form/phpmailerprocess.php on line 22

Warning: Variable passed to each() is not an array or object in /usr/home/jak2234/public_html/new_form/phpmailerprocess.php on line 22

Notice: Undefined variable: success in /usr/home/jak2234/public_html/new_form/phpmailerprocess.php on line 36
Sorry the server was unable to upload the files...

Если кто-то может помочь с ЛЮБЫМ из них или дать свой вклад в лучший способ сделать это, это было бы очень полезно.

Большое спасибо !!!

1 Ответ

1 голос
/ 14 июля 2011

Первое предупреждение: вы сами изменяете каталог uploads. Если каталог не принадлежит идентификатору пользователя вашего веб-сервера, вы получите ошибку отказа в разрешении - вы не можете chmod что-то, что вам не принадлежит.

Второе и третье предупреждение: Ваши ключи массива в массиве $_FILES неверны. Они должны быть

while(list($key,$value) = each($_FILES['images']['name']))

обратите внимание на кавычки - без кавычек PHP предполагает, что они являются константами, которые были созданы с помощью define(). Если с таким именем нет константы, вежливый PHP будет рассматривать их как строки с одинаковыми именами, но выдает предупреждение.

Четвертое предупреждение: вы злоупотребляете each(). Вместо этого просто имейте:

foreach($_FILES['images']['name'] as $key => $value) {

Пятое предупреждение: единственное место, где вы присваиваете значение $success, находится внутри if(), который выполняет копирование изображения, когда копирование файла завершается успешно. Поскольку ваш код поврежден, копирование никогда не происходит, поэтому $success никогда не определяется. Чтобы исправить, поставьте

$success = false;

где-то вверху вашего файла, поэтому он определен со значением по умолчанию.

Кроме того, не используйте copy() в загруженных файлах. Есть проблемы безопасности, связанные с PHP и загрузкой файлов на общие серверы. Вместо этого используйте move_uploaded_file(). Это также будет намного более дешевой операцией, поскольку перемещение файла в пределах одной файловой системы происходит практически мгновенно, тогда как copy() фактически дублирует файл - для больших файлов это очень дорого (время + процессор + дисковое пространство) очень быстро.


комментарий:

Неважно, как вы называете поля ввода, так как это будет определять, как все будет отображаться в массиве файлов.

Если вы выберете опцию file1, file2 и т. Д., Вы получите:

$_FILES = array(
    'file1' => array('name' => ..., 'size' => ..., etc...),
    'file2' => array('name' => ..., 'size' => ..., etc...),
    etc...
)

Если вы сделаете files[], вы получите:

$_FILES = array (
   'files' => array
        'name' => array(
            0 = 'name of first file',
            1 = 'name of second file',
            ...
        'size' => array(
            0 = 'size of first file'
            1 = 'name of second file'
         etc...

Основное структурное отличие. Я понятия не имею, почему такая глупая разница была разрешена для производства, но, поскольку это основная функциональность PHP, изменить ее на более логически непротиворечивую в принципе невозможно.

...