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

如何将jsPDF生成的PDF发送至Zend 1(PHP)后端并作为邮件附件

我之前也碰到过一模一样的问题——jsPDF生成的PDF本地下载没问题,但要通过AJAX传给后端用Zend_Mail发附件,各种output格式试了都踩坑。下面是我折腾出来的可行方案,分前端和后端两部分说:

一、前端:正确处理jsPDF输出并发送AJAX

核心是避免直接传递字符串化的二进制数据,推荐用Blob+FormData的方式,这是最稳妥的,后端接收起来和普通文件上传完全一致:

// 假设你已经生成了jsPDF实例pdf
const pdfBlob = pdf.output('blob'); // 生成Blob格式的PDF
const formData = new FormData();

// 把Blob添加到FormData,第三个参数是附件的文件名
formData.append('pdfAttachment', pdfBlob, 'document.pdf');

// 发送AJAX请求(用fetch或者jQuery.ajax都可以)
fetch('/your-backend-endpoint', {
  method: 'POST',
  body: formData
})
.then(res => res.json())
.then(result => {
  if (result.success) {
    console.log('邮件发送成功!');
  } else {
    console.error('发送失败:', result.error);
  }
})
.catch(err => console.error('请求出错:', err));

如果非要用base64传递(比如不想用FormData),记得要去掉data URI的前缀,不然后端解码会失败:

const pdfDataUri = pdf.output('datauristring');
// 去掉"data:application/pdf;base64,"前缀,只保留纯base64字符串
const pureBase64 = pdfDataUri.split(',')[1];

fetch('/your-backend-endpoint', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    pdfBase64: pureBase64,
    filename: 'document.pdf'
  })
});
二、后端:用Zend_Mail接收并添加附件

这里以Zend Framework 1的Zend_Mail为例,分两种情况处理:

情况1:前端用FormData发送(推荐)

后端直接像处理普通文件上传一样接收:

// 检查文件上传是否成功
if ($_FILES['pdfAttachment']['error'] === UPLOAD_ERR_OK) {
    try {
        // 初始化Zend_Mail
        $mail = new Zend_Mail('UTF-8');
        $mail->setFrom('your-email@example.com', '你的名字');
        $mail->addTo('recipient@example.com', '收件人名字');
        $mail->setSubject('带PDF附件的邮件');
        $mail->setBodyText('这是邮件正文,附件是前端生成的PDF');

        // 读取上传的PDF文件内容,创建附件
        $pdfContent = file_get_contents($_FILES['pdfAttachment']['tmp_name']);
        $attachment = $mail->createAttachment($pdfContent);
        
        // 设置附件属性
        $attachment->filename = $_FILES['pdfAttachment']['name'];
        $attachment->disposition = Zend_Mail::DISPOSITION_ATTACHMENT;
        $attachment->encoding = Zend_Mail::ENCODING_BASE64;

        // 发送邮件
        $mail->send();
        echo json_encode(['success' => true]);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
} else {
    echo json_encode(['success' => false, 'error' => 'PDF文件上传失败']);
}

情况2:前端用base64发送

后端需要先解码base64字符串,再创建附件:

// 接收JSON格式的请求体
$requestData = json_decode(file_get_contents('php://input'), true);

if (isset($requestData['pdfBase64']) && isset($requestData['filename'])) {
    try {
        $mail = new Zend_Mail('UTF-8');
        // ... 同上设置邮件基本信息 ...

        // 解码base64字符串得到PDF二进制内容
        $pdfContent = base64_decode($requestData['pdfBase64']);
        $attachment = $mail->createAttachment($pdfContent);
        
        $attachment->filename = $requestData['filename'];
        $attachment->disposition = Zend_Mail::DISPOSITION_ATTACHMENT;
        $attachment->encoding = Zend_Mail::ENCODING_BASE64;

        $mail->send();
        echo json_encode(['success' => true]);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
} else {
    echo json_encode(['success' => false, 'error' => '缺少必要参数']);
}
几个要注意的坑
  1. 后端要检查php.ini的上传限制:upload_max_filesize和post_max_size要设置得比你的PDF文件大,不然会上传失败。
  2. 用FormData发送时,不要手动设置Content-Type,浏览器会自动生成正确的multipart/form-data头。
  3. 如果要把domtoimage转的PNG也作为附件,和PDF的处理逻辑完全一样,把PNG的Blob添加到FormData里即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:58:27