You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMailer上传附件报Undefined array key attachment错误

问题根因

两个核心问题导致报错:

  • 前端表单缺失文件上传必需的编码属性:当前<form>标签仅配置了method="post"和action属性,未添加enctype="multipart/form-data"。表单默认编码格式application/x-www-form-urlencoded不支持二进制文件传输,不加该属性时浏览器无法正确封装文件内容,PHP不会将上传文件解析到$_FILES全局数组中,仅会处理普通文本字段,这就是普通字段能正常发送邮件、附件始终处理失败的核心原因。你在开发者工具看到的附件字段只是表单DOM的字段标识,不代表文件内容被正确编码提交。
  • 后端代码未做字段存在性校验:直接访问$_FILES['attachment'],当文件未被正确解析时该数组键不存在,就会触发Undefined array key "attachment"、Trying to access array offset on value of type null两类报错。
修复方案

前端修改

给form标签补充必填的编码属性,修改后form标签开头代码如下:

<form action="handler-att.php" method="post" enctype="multipart/form-data">

其余表单代码无需调整。

后端修改

替换原有附件处理逻辑,增加上传状态校验、同名文件冲突处理,代码如下:

// 校验附件字段存在、且无上传错误
if (isset($_FILES['attachment']) && $_FILES['attachment']['error'] === UPLOAD_ERR_OK) {
    // 用__DIR__拼绝对路径,避免相对路径解析出错
    $uploadDir = __DIR__ . '/uploads/';
    // 给上传文件增加唯一ID前缀,避免同名文件覆盖
    $saveFileName = uniqid() . '_' . basename($_FILES['attachment']['name']);
    $targetFilePath = $uploadDir . $saveFileName;
    
    if (move_uploaded_file($_FILES['attachment']['tmp_name'], $targetFilePath)) {
        // 第二个参数指定邮件内显示的原始文件名,隐藏服务器上的存储文件名
        $mail->addAttachment($targetFilePath, $_FILES['attachment']['name']);
    }
}
额外注意事项
  • 确认同级的uploads目录拥有PHP运行身份的写入权限,Linux环境建议设置权限为755,不要使用777权限避免安全风险
  • 若需要限制上传文件大小,需同步修改php.ini配置中upload_max_filesize、post_max_size两个参数,参数值需要大于你允许的最大上传文件体积
  • 建议增加文件后缀、MIME类型校验,仅允许业务需要的文件格式(如pdf、doc、docx等)上传,防止恶意脚本上传带来的安全问题

内容的提问来源于stack exchange,提问作者Rahul Banerjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:09:18