【问题标题】:File attachment validation with PHPMailer使用 PHPMailer 验证文件附件
【发布时间】:2013-10-04 15:44:03
【问题描述】:

我有一个 html 表单,我正在使用 PHPMailer 通过电子邮件发送表单内容。在表格中,我有一个文件附件部分。我的要求是文件必须小于 2mb,并且必须是 pdf、doc 或 docx 文件。当我在验证 if 语句中添加时,我的表单停止工作:

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 脚本:

<?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>

【问题讨论】:

  • 我不确定 filesize() 和 mime_type() 是否按您希望的方式工作。与您使用 $_FILES['fileUpload']['name'] 和 $_FILES['fileUpload']['tmp_name'] 的方式类似,$_FILES[] 对象中的值可以为您提供文件大小和文件类型。见w3schools.com/php/php_file_upload.asp
  • 是的,我是对的问题在括号中!

标签: php forms validation phpmailer


【解决方案1】:

您缺少右括号 ),但请查看以下内容,因为您的代码不会按照您期望的方式运行...

我不确定这些功能是否按照您期望的方式工作:

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

这些可用于文件系统上的物理文件,但在代码的前面,您将“$file”分配给您上传的文件的字符串名称,而不是像filesize() 期望的物理文件路径!

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

执行此操作时,您已经为 $file 变量分配了文件名,而不是文件本身的路径。

与您使用$_FILES['fileUpload']['name']$_FILES['fileUpload']['tmp_name'] 的方式类似,$_FILES[] 对象中的值会在文件上传后为您提供文件大小和文件类型:

检查尺寸:

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

检查它是否为 PDF:

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

更新:未附加附件

我认为您的文件没有实际附加的问题是因为您只是向 $mail-&gt;AddAttachment() 函数提供文件的临时名称,而不是像预期的那样提供文件的完整路径。

您需要先将文件移动到您知道它所在位置的某个位置,您可以使用move_uploaded_file() 函数执行此操作,请参阅http://php.net/manual/en/function.move-uploaded-file.php

然后,当您将文件放在您知道路径的位置时,将此路径提供给$mail-&gt;AddAttachment()

This example on w3schools 展示了使用此功能将文件移动到您想要的任何位置!

【讨论】:

  • 好的,我把它改成了 if ((isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] == UPLOAD_ERR_OK) && $_FILES[' fileUpload']['size'] AddAttachment($_FILES['fileUpload']['tmp_name' ], $_FILES['fileUpload']['name']);现在表单无论如何都会提交。如果文件不是 pdf,则不附加该文件。如果文件不是 pdf,我希望不提交表单。
  • 检查我的更新,您需要将文件从临时目录中移动,然后将完整路径提供给 AddAttachment() 函数,此时您只是为其提供临时名称而不是通往它的道路!
  • 好吧,没关系。我想出了如何杀死脚本。感谢大家的帮助!
【解决方案2】:

您似乎没有将 if 语句括在括号中

【讨论】:

  • 这很尴尬 :) 这样就解决了问题。表单提交但文件未附加。
【解决方案3】:

解析错误:语法错误,第 2 行出现意外的 '&&' (T_BOOLEAN_AND)

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,如上例所示。

【讨论】:

  • @Coulton:嗯...?这正是我写的,编辑在哪里? :]
  • @Coulton:知道了,抱歉,我在编辑几分钟后发现“千字节”没有正确写入!
  • 我添加了相当长的一段,然后在我意识到这不是我的答案时将其删除。 :)
  • 哦,有趣..那真是太快了! :P
猜你喜欢
  • 2021-09-10
  • 2016-10-28
  • 1970-01-01
  • 2013-08-07
  • 2020-12-05
  • 1970-01-01
  • 2018-06-17
  • 2013-03-15
相关资源
最近更新 更多