2013-10-04 7 views
1

У меня есть html-форма, и я использую PHPMailer для отправки по электронной почте содержимого формы. В форме у меня есть раздел для прикрепления файла. Мои требования заключаются в том, что файл должен быть меньше 2 МБ, и это должен быть файл pdf, doc или docx. Когда я добавил в проверке, если заявление, моя форма перестала работать:Проверка прикрепления файлов с помощью PHPMailer

if ((isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] == UPLOAD_ERR_OK) && filesize($file) < $maxsize && in_array(mime_content_type($file), $types)) { 
    $mail->AddAttachment($_FILES['fileUpload']['tmp_name'], 
         $_FILES['fileUpload']['name']); 
} 

Вот полный скрипт:

<?php 

require_once('assets/PHPMailer/class.phpmailer.php'); 

$first_name = $_POST['first_name']; 
$last_name = $_POST['last_name']; 
$phone = $_POST['phone']; 
$email = $_POST['email']; 
$job = $_POST['job']; 
$file = $_FILES['fileUpload']['name']; 


$mail = new PHPMailer(); 

$mail->From = "xxxxx"; 
$mail->FromName = "xxxxx"; 
$mail->AddAddress("xxxxx","xxxxx"); 

$mail->WordWrap = 50; 

$mail->Subject = "Job form"; 
$mail->Body=" 
      First Name: $first_name 
      Last Name: $last_name 
      Email: $email 
      Job: $job"; 

$maxsize = 2 * 1024 * 1024; 
$types = array('application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); 


if (isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] == UPLOAD_ERR_OK) && filesize($file) < $maxsize && in_array(mime_content_type($file), $types) { 
    $mail->AddAttachment($_FILES['fileUpload']['tmp_name'], 
         $_FILES['fileUpload']['name']); 
} 


if(!$mail->Send()) 
{ 
    echo 'Message was not sent.'; 
    echo 'Mailer error: ' . $mail->ErrorInfo; 
} 
else 
{ 
    echo 'Thank you for your feedback.'; 
} 

?> 

Вот HTML форма:

<form enctype="multipart/form-data" action="jobform.php" method="POST"> 
    <input type="text" name="first_name" value="First Name"> 
    <input type="text" name="last_name" value="Last Name"> 
    <input type="text" name="phone" value="Phone"><br /> 
    <input type="text" name="email" value="Email"> 
    <select name="job"><br /> 
     <option>Graphic Design Intern</option> 
     <option>ASP.Net Developer</opttion> 
     <option>Marketing Coordinator</option> 
     <option>Social Media Content Writer</option> 
    </select><br /> 
    <div><h4>Résumé</h4><input type="file" name="fileUpload" /><br /></div> 
    <p></p> 
    <input class="btn btn-large btn-success" type="submit" value="Submit"> 
</form> 
+0

Я не уверен, что filesize() и mime_type() работают так, как вы этого хотите. Аналогично тому, как вы использовали $ _FILES ['fileUpload'] ['name'] и $ _FILES ['fileUpload'] ['tmp_name'], в объекте $ _FILES [] есть значения, которые предоставляют вам размер файла и тип файла. См. Http://www.w3schools.com/php/php_file_upload.asp – Luke

+0

Да, я прав, проблема в скобках! – Nickool

ответ

1

Вам не хватает закрытого нг parenthesise ) но посмотрите на следующем, потому что ваш код не будет работать так, как вы ожидаете, что ...

Я не уверен, что эти функции работают так, как вы ожидаете их:

filesize($file); 
mime_content_type($file); 

Они могут быть использованы для физических файлов в файловой системе, но раньше в вашем коде вы назначите «$ файла» только имя строки из файла, который вы загрузили - не физический путь к файлу, как filesize() предпологает!

// You assigned the file name, not the file path!! 
$file = $_FILES['fileUpload']['name']; 

Когда вы делаете это, вы присвоили переменной $ файла только имя файла, а не путь к самому файлу.

Подобно тому, как вы использовали $_FILES['fileUpload']['name'] и $_FILES['fileUpload']['tmp_name'], есть значения в пределах [] объекта $ _FILES, которые предоставляют Вам размер и тип файла, как только файл был загружен:

Проверьте размер:

if ($_FILES['fileUpload']['size'] < $maxsize) 
{ 
} 

Убедитесь, что это PDF:

if ($_FILES['fileUpload']['type'] == "application/pdf") 
{ 
} 

UPDATE: Приложение не прилагается

Я думаю, что проблема с файлом на самом деле не связана с тем, что вы предоставляете только временное имя файла своей функции $mail->AddAttachment(), а не полный путь к файлу, который он ожидает.

Вам нужно перенести файл туда, где вы знаете, где он находится, вы можете сделать это, используя функцию move_uploaded_file(), см. http://php.net/manual/en/function.move-uploaded-file.php.

Затем, когда у вас есть файл в том месте, где вы знаете путь, укажите этот путь до $mail->AddAttachment().

This example on w3schools показывает использование этой функции для перемещения файла туда, где вы хотите!

+0

Хорошо, я изменил его на if ((isset ($ _ FILES ['fileUpload']) && $ _FILES ['fileUpload'] ['error'] == UPLOAD_ERR_OK) && $ _FILES ['fileUpload'] ['size' ] <$ maxsize && $ _FILES ['fileUpload'] ['type'] == "application/pdf") { $ mail-> AddAttachment ($ _ FILES ['fileUpload'] ['tmp_name'], $ _FILES [ 'FileUpload'] [ 'имя']); } Теперь форма отправляется независимо от того, что. Если файл не является файлом PDF, файл не подключен. Я бы хотел, чтобы форма не отправлялась, если файл не является pdf. – user715564

+0

Проверьте мое обновление, вам нужно переместить файл из каталога temp, а затем предоставить FULL PATH функции AddAttachment(), в тот момент, когда вы просто предоставляете ему имя temp, а не путь к нему! – Luke

+0

Не стесняйтесь повышать такой полезный ответ: P – Luke

1

Это выглядит как вы не завернули ваш оператор if в скобках

+0

Это неловко :) Такой вопрос исправлен. Форма отправляется, но файл не прилагается. – user715564

0

Parse error: syntax error, unexpected '&&' (T_BOOLEAN_AND) on line 2

if (isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] == UPLOAD_ERR_OK) && filesize($file) < $maxsize && in_array(mime_content_type($file), $types) { 
    $mail->AddAttachment($_FILES['fileUpload']['tmp_name'], 
         $_FILES['fileUpload']['name']); 
} 

Возможно, вы пропустили несколько скобки здесь?

Попробуйте вместо этого:

<?php 
if ((isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] == UPLOAD_ERR_OK) && filesize($file) < $maxsize && in_array(mime_content_type($file), $types)) { 
    $mail->AddAttachment($_FILES['fileUpload']['tmp_name'], 
         $_FILES['fileUpload']['name']); 
} 
?> 

Кроме того, я не уверен, что mime_content_type может работать так, как вы хотите, чтобы ..

** Редактировать **

Я не думаю, вы можете получить размер файла из $ _FILES ['fileUpload'] ['name'].

Следуйте официальный W3C пример:

<?php 
if ($_FILES["file"]["error"] > 0) 
    { 
    echo "Error: " . $_FILES["file"]["error"] . "<br>"; 
    } 
else 
    { 
    echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
    echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
    echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
    echo "Stored in: " . $_FILES["file"]["tmp_name"]; 
    } 
?> 

Эта линия:

echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 

Итак, имейте в виду, что размер файла будет отброшен в байтах, а не килобайт. Если вы хотите, чтобы в килобайтах разделили его на 1024, как показано в примере выше.

+0

Извините, я отредактировал неправильный ответ: $ – Luke

+0

@Coulton: hmm ...? Это именно то, что я написал, где редактирование? :] – briosheje

+0

@Coulton: Получил это, извините, я узнал через несколько минут после редактирования, что «килобайты» написаны неправильно! – briosheje

Смежные вопросы