Google Apps Script无法通过POST向PHP页面发送PDF附件的问题
问题解决:Google Apps Script 向 PHP 接口传递 PDF 附件失败
问题根源
你当前的GAS代码直接将DriveFile对象放入POST payload中,UrlFetchApp无法自动将其转换为HTML表单上传文件时的multipart/form-data格式,导致PHP端无法通过$_POST获取到文件(文件上传数据实际存储在$_FILES全局变量中)。
解决方案步骤
1. 修改Google Apps Script代码
无需将PDF保存到Drive(可省略DriveApp.createFile步骤,直接使用Blob对象),同时正确构造包含文件的POST payload:
// 生成PDF Blob(无需存入Drive) var token = ScriptApp.getOAuthToken(); var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } }); var pdfBlob = docurl.getAs('application/pdf'); pdfBlob.setName("文档名称.pdf"); // 设置附件文件名 // 构造POST请求参数 var payload = { 'RecipientEmail': ToUser, 'RecipientLabel': ToUserName, 'EmailSubject': MailSubject, 'EmailBody': MailBody, 'AttachedFile': pdfBlob // 直接传入Blob对象,UrlFetchApp会自动处理为multipart格式 }; var options = { 'method': 'post', 'payload': payload, 'muteHttpExceptions': true // 可选,方便调试查看错误 }; var url = "http://XXX/phpmailer.php"; var response = UrlFetchApp.fetch(url, options).getContentText(); Logger.log(response); // 查看接口返回信息,辅助调试
2. 修改PHP端接收代码
文件上传数据存储在$_FILES中,而非$_POST,需调整参数接收逻辑:
// 接收普通文本参数 $RecipientEmail = $_POST['RecipientEmail'] ?? ''; $RecipientLabel = $_POST["RecipientLabel"] ?? ''; $EmailSubject = $_POST["EmailSubject"] ?? ''; $EmailBody = $_POST["EmailBody"] ?? ''; // 接收上传的文件 $AttachedFile = $_FILES['AttachedFile'] ?? null; // 验证文件是否上传成功 if ($AttachedFile && $AttachedFile['error'] === UPLOAD_ERR_OK) { // 获取临时文件路径、文件名、MIME类型 $tempFilePath = $AttachedFile['tmp_name']; $fileName = $AttachedFile['name']; $fileType = $AttachedFile['type']; // 后续用PHPMailer添加附件: // $mail->addAttachment($tempFilePath, $fileName); } else { // 处理文件上传失败的情况 echo "附件上传失败"; }
3. 关键说明
- GAS中直接传入Blob对象到payload的文件字段,UrlFetchApp会自动设置正确的
multipart/form-data请求头和文件格式,无需手动拼接。 - PHP端必须通过
$_FILES获取上传文件,$_POST仅用于接收普通文本参数。 - 可选添加
muteHttpExceptions: true并打印响应,方便排查接口返回的错误信息。
内容的提问来源于stack exchange,提问作者user22373865
相关产品推荐
相关产品推荐

