使用phpmailer发送多个附件,我只需要将PDF';s

使用phpmailer发送多个附件,我只需要将PDF';s,php,server,Php,Server,我对一个相当大的应用程序的一页有问题。该页面有一个表单,用于附加来自用户的文件,并通过PHPMailer向其发送电子邮件。我现在需要添加只保存那些PDF附件的功能。我已经包括了需要修改的部分。新部分位于星号行之间 //Handle the files $total = count($_FILES['uploadfile']['tmp_name']); for ($i = 0; $i < $total; $i++) { $name = $_FILES['uploadfile'

我对一个相当大的应用程序的一页有问题。该页面有一个表单,用于附加来自用户的文件,并通过PHPMailer向其发送电子邮件。我现在需要添加只保存那些PDF附件的功能。我已经包括了需要修改的部分。新部分位于星号行之间

//Handle the files
$total = count($_FILES['uploadfile']['tmp_name']);
    for ($i = 0; $i < $total; $i++) {
    $name = $_FILES['uploadfile']['name'][$i];
    $path = $_FILES['uploadfile']['tmp_name'][$i];
    $type = $_FILES['uploadfile']['type'][$i];
    $mail->AddAttachment($path,$name);
 //*************************************************************************************
// NEW PDF CHECK HERE
$ext = pathinfo($path, PATHINFO_EXTENSION);

if ($ext == '.pdf'){
    if (move_uploaded_file($_FILES['uploadfile']['tmp_name'][$i], "path/to/file/{$_FILES['uploadfile']['name']}")){
            $pdfquery = "INSERT INTO reports (case_id, user_id, filename, upload_date, dept_id) VALUES ('$case_id', '$user', '{$_FILES['uploadfile']['name']}', CURDATE(), '$dept_id')";
            $pdfresult = mysqli_query($dbc, $pdfquery) or trigger_error("Query: $pdfquery\n<br>MySQL Error: " . mysqli_error($dbc));

            if (mysqli_affected_rows($dbc) == 1){
                echo 'PDF Case Report Saved.<br><br>';
            } else {
                echo 'report failed to save to database.';

            }//END affected rows
     }  // END move report.
} // END $ext check.

//************************************************************************************* 
    } // END for loop.
//处理文件
$total=计数($_文件['uploadfile']['tmp_名称']);
对于($i=0;$i<$total;$i++){
$name=$_文件['uploadfile']['name'][$i];
$path=$\u文件['uploadfile']['tmp\u名称'][$i];
$type=$\u文件['uploadfile']['type'][$i];
$mail->AddAttachment($path,$name);
//*************************************************************************************
//新的PDF检查在这里
$ext=pathinfo($path,pathinfo_扩展名);
如果($ext=='.pdf'){
如果(移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)){
$pdfquery=“在报告中插入(案例id、用户id、文件名、上载日期、部门id)值(“$case\u id”、“$user”、“{$\u FILES['uploadfile']['name']}”、CURDATE()、“$dept\u id”);
$pdfresult=mysqli_查询($dbc,$pdfquery)或触发器_错误(“查询:$pdfquery\n
MySQL错误:“.mysqli_错误($dbc)); if(mysqli_受影响的_行($dbc)==1){ echo“PDF病例报告已保存。

”; }否则{ echo“报告未能保存到数据库”; }//结束受影响的行 }//结束移动报告。 }//结束$ext检查。 //************************************************************************************* }//循环结束。
您只需检查mime类型,而不是扩展名(.pdf),因为可以将名为evil.pdf的PHP文件上载到您的服务器,或者有人可能会上载具有不同扩展名的pdf。我只向你展示与问题相关的部分

$total = count($_FILES['uploadfile']['tmp_name']);
for ($i = 0; $i < $total; $i++) {
    //Attach the file anyway
    $name = $_FILES['uploadfile']['name'][$i];
    $path = $_FILES['uploadfile']['tmp_name'][$i];
    $type = $_FILES['uploadfile']['type'][$i];
    $mail->AddAttachment($path,$name);
    if (finfo_file(finfo_open(FILEINFO_MIME_TYPE), $_FILES['file']['tmp_name']) !== 'application/pdf') {
        //file does not have the expected mime type, possibly this is a hack
        //attempt, therefore we ignore the file
        continue;
    }
    //If the program reaches this point, then the file is PDF
}
$total=count($_文件['uploadfile']['tmp_名称]]);
对于($i=0;$i<$total;$i++){
//还是要附加文件
$name=$_文件['uploadfile']['name'][$i];
$path=$\u文件['uploadfile']['tmp\u名称'][$i];
$type=$\u文件['uploadfile']['type'][$i];
$mail->AddAttachment($path,$name);
如果(finfo_文件(finfo_打开(FILEINFO_MIME_类型),$_文件['file']['tmp_name'])!='application/pdf'){
//文件没有预期的mime类型,可能是黑客攻击
//尝试,因此我们忽略该文件
继续;
}
//如果程序达到这一点,则文件为PDF
}

我想我应该说,脚本的这一部分仅由董事会级别的员工访问,所有文件都需要通过电子邮件发送,但只有PDF文件需要保存。@StephenThompson,您尝试过这个建议吗?这能解决你的问题吗?如果没有,您还有什么问题?不能忽略这些文件,它们都需要附加。如果!=pdf{attach}if=pdf{attach AND save to server}@StephenThompson,明白。我已经编辑了我的答案。基本上:在检查pdf mime类型并继续之前,需要附加文件。