如何将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' => '缺少必要参数']); }
几个要注意的坑
- 后端要检查
php.ini的上传限制:upload_max_filesize和post_max_size要设置得比你的PDF文件大,不然会上传失败。 - 用FormData发送时,不要手动设置
Content-Type,浏览器会自动生成正确的multipart/form-data头。 - 如果要把domtoimage转的PNG也作为附件,和PDF的处理逻辑完全一样,把PNG的Blob添加到FormData里即可。
内容的提问来源于stack exchange,提问作者Adeel
相关产品推荐
相关产品推荐

