PHP formHandler实现单表单多图片邮件发送方法求助
多图上传邮件发送修改方案
问题核心
当文件上传字段名以[]结尾(即你前端写的name="userImages[]")时,PHP接收的$_FILES['userImages']会从单文件的键值对结构,变为多文件的嵌套数组结构:
- 单文件场景:
$_FILES['userImages']['name']是字符串类型的单个文件名 - 多文件场景:
$_FILES['userImages']['name']是数组类型,包含所有上传文件的文件名,tmp_name、error等属性同理
你原有代码是按单文件结构写的,直接把数组当字符串读取、只拼接一个附件段,自然无法正常发送多图。
修改后可用代码
你的前端表单代码无需调整,直接替换formHandler.php的全部内容即可:
<?php //////////////////////////////////////////////////////////////////////////// // 接收普通表单字段 $name = trim($_POST['userName']); $email = trim($_POST['userEmail']); $userImages = $_FILES['userImages']; //////////////////////////////////////////////////////////////////////////// $composition = "\r\n\n\nName: " . $name . "\r\nEmail Address: " . $email; //////////////////////////////////////////////////////////////////////////// $subject = "Form Submission"; $fromname = $name; $fromemail = $email; $mailto = 'receiving@email.com'; //////////////////////////////////////////////////////////////////////////// $separator = md5(time()); $eol = "\r\n"; // 组装邮件头 $headers = "From: ".$fromname." <".$fromemail.">" . $eol; $headers .= "MIME-Version: 1.0" . $eol; $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol; $headers .= "Content-Transfer-Encoding: 7bit" . $eol; $headers .= "This is a MIME encoded message." . $eol; // 拼接邮件正文文本部分 $body = "--" . $separator . $eol; $body .= "Content-Type: text/plain; charset=\"utf-8\"" . $eol; $body .= "Content-Transfer-Encoding: 8bit" . $eol; $body .= $composition . $eol; // 循环处理所有上传的图片 foreach ($userImages['error'] as $index => $error) { // 自动跳过上传出错的文件 if ($error !== UPLOAD_ERR_OK) { continue; } // 读取当前索引对应的文件信息 $tmpFilePath = $userImages['tmp_name'][$index]; $originalFileName = $userImages['name'][$index]; // 编码文件内容 $fileContent = file_get_contents($tmpFilePath); $fileContent = chunk_split(base64_encode($fileContent)); // 拼接当前图片的附件段 $body .= "--" . $separator . $eol; $body .= "Content-Type: application/octet-stream; name=\"" . $originalFileName . "\"" . $eol; $body .= "Content-Transfer-Encoding: base64" . $eol; $body .= "Content-Disposition: attachment; filename=\"" . $originalFileName . "\"" . $eol; $body .= $fileContent . $eol; } // 拼接MIME结束分隔符 $body .= "--" . $separator . "--"; //////////////////////////////////////////////////////////////////////////// // 发送邮件 mail($mailto, $subject, $body, $headers); //////////////////////////////////////////////////////////////////////////// // 提交成功后跳转 header('location: /formSent_confirmationPage.php'); ?>
优化点说明
- 补全了多文件遍历逻辑,支持任意数量的上传图片作为附件发送
- 新增上传错误校验,自动跳过传输失败的文件,避免文件读取报错
- 将原代码的
iso-8859-1字符集替换为utf-8,后续新增中文字段不会出现乱码 - 补全了附件头的
filename参数,所有邮箱客户端都能正常识别附件原名 - 移除了原代码中
@错误屏蔽符,如果发送失败可以直接看到PHP报错,方便排查问题
内容的提问来源于stack exchange,提问作者user8322896
相关产品推荐
相关产品推荐

