使用PHPMailer发送带附件邮件时数组传参报错排查
PHPMailer带附件发送报错:传入数组而非字符串
作为PHP新手,我严格按照PHPMailer官方示例代码实现带附件邮件发送功能,但相关文件上传函数(PHPMailer::mb_pathinfo、hash、move_uploaded_file)均报错,提示传入数组而非预期的字符串。通过var_dump发现$_FILES['files']['name']确实为数组(array(1) { [0]=> string(12) "Frame 39.png" })。我认为可能需要将其转为字符串,但示例代码无需此操作即可正常运行,请问我忽略了什么?
相关代码与错误信息
$ext = PHPMailer::mb_pathinfo($_FILES['files']['name'], PATHINFO_EXTENSION); //PHP Warning: preg_match() expects parameter 2 to be string, array given in /home1/public_html/PHPMailer/PHPMailer.php on line 4568 $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['files']['name'])) . '.' . $ext; //PHP Warning: hash() expects parameter 2 to be string, array given in /home1/public_html/submit.php on line 58 if (move_uploaded_file($_FILES['files']['tmp_name'], $uploadfile)) { [...] //PHP Warning: move_uploaded_file() expects parameter 1 to be string, array given in /home1/public_html/submit.php on line 60
问题原因与解决方法
核心原因:你的表单文件上传字段是多文件上传(比如
name="files[]"),所以$_FILES返回数组结构;而PHPMailer官方示例用的是单文件上传(name="files"),示例代码直接按字符串处理即可,两者结构不匹配导致报错。解决方式二选一:
- 若需支持多文件上传,遍历数组逐个处理文件:
foreach ($_FILES['files']['name'] as $key => $filename) { $ext = PHPMailer::mb_pathinfo($filename, PATHINFO_EXTENSION); $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $filename)) . '.' . $ext; if (move_uploaded_file($_FILES['files']['tmp_name'][$key], $uploadfile)) { // 添加附件到邮件 // $mail->addAttachment($uploadfile, $filename); } } - 若只需单文件上传,修改HTML表单的文件字段,把
name="files[]"改成name="files",即可直接复用官方示例代码。
- 若需支持多文件上传,遍历数组逐个处理文件:
内容的提问来源于stack exchange,提问作者GtwoK
相关产品推荐
相关产品推荐

