PHP CURL调用BoldSign API返回空数组及文件打开失败问题
问题描述
通过命令行可正常调用BoldSign API,但转为PHP CURL代码调用后,最初仅返回空数组;调整代码后,出现**"无法打开文件 '/tmp/phpWQLlLP.pdf'"**错误,请求排查原因。
初始PHP代码
<?php $name = $_POST['testName']; $email = $_POST['testEmail']; $file = $_FILES['testFile']; $url = $_POST['testURL']; runSend($file, $name, $email); function runSend($file, $name, $email){ echo "Success, message sent"; echo $file; echo $name; echo $email; echo $url; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.boldsign.com/v1/document/send'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $post = array( 'Title' => 'Commercial Agreement', 'Message' => 'Terms, purpose and duration of agreement ', 'UseTextTags' => 'true', 'EnableSigningOrder' => 'false', 'Signers[0][Name]' => 'Example Name', 'Signers[0][EmailAddress]' => 'example@example.com.au', 'Signers[0][SignerOrder]' => '0', 'Signers[0][FormFields][0][FieldType]' => 'Signature', 'Signers[0][FormFields][0][Name]' => 'sign_field', 'Signers[0][FormFields][0][PageNumber]' => '1', 'Signers[0][FormFields][0][Bounds][X]' => '50', 'Signers[0][FormFields][0][Bounds][Y]' => '50', 'Signers[0][FormFields][0][Bounds][Width]' => '200', 'Signers[0][FormFields][0][Bounds][Height]' => '30', 'Signers[0][FormFields][0][IsRequired]' => 'true', 'Files' => new CURLFILE($file) ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $headers = array(); $headers[] = 'X-Api-Key: EXAM76242$PLEA32PIK555EY'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); ?>
HTML表单代码
<form action="/wp-content/themes/hello-theme-child-master/send-test-file.php" method="post" enctype="multipart/form-data"> name: <input type="text" id="testName" name="testName" value="[7401]"><br> email <input type="text" id="testEmail" name="testEmail" value="testEmail"><br> Select pdf to upload: <input type="file" name="testFile" id="testFile"> <input type="text" id="testURL" name="testURL" value="[e2pdf-download id="31" output='url']"><br> <input type="submit" value="Send File" name="submit"> </form>
更新后PHP代码及错误信息
更新后的PHP代码
<?php if ($_FILES['testFile']['error'] !== UPLOAD_ERR_OK) { die("File upload failed with error code " . $_FILES['testFile']['error']); } $file = $_FILES['testFile']; runSend($file); function runSend($file){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.boldsign.com/v1/document/send'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $post = array( 'DisableExpiryAlert' => 'false', 'ReminderSettings.ReminderDays' => '5', 'BrandId' => '', 'ReminderSettings.ReminderCount' => '3', 'EnableReassign' => 'false', 'Message' => '', 'Signers[0][Name]' => 'Enter Name', 'Signers[0][EmailAddress]' => 'example@example.com.au', 'Signers[0][SignerOrder]' => '0', 'Signers[0][FormFields][0][FieldType]' => 'Signature', 'Signers[0][FormFields][0][Name]' => 'sign_field', 'Signers[0][FormFields][0][PageNumber]' => '1', 'Signers[0][FormFields][0][Bounds][X]' => '50', 'Signers[0][FormFields][0][Bounds][Y]' => '50', 'Signers[0][FormFields][0][Bounds][Width]' => '200', 'Signers[0][FormFields][0][Bounds][Height]' => '30', 'Signers[0][FormFields][0][IsRequired]' => 'true', 'ExpiryDays' => '30', 'EnablePrintAndSign' => 'false', 'AutoDetectFields' => 'false', 'OnBehalfOf' => '', 'EnableSigningOrder' => 'false', 'UseTextTags' => 'true', 'SendLinkValidTill' => '', 'Files' => new CURLFILE($file['tmp_name'].'.pdf'), 'Title' => 'testing', 'HideDocumentId' => 'false', 'EnableEmbeddedSigning' => 'false', 'ExpiryDateType' => 'Days', 'ReminderSettings.EnableAutoReminder' => 'true', 'ExpiryValue' => '60', 'DisableEmails' => 'false' ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $headers = array(); $headers[] = 'Accept: application/json'; $headers[] = 'X-API-Key: GWAGsagsgaEAWT2545q3AF'; $headers[] = 'Content-Type: multipart/form-data'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); echo $result; $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo $httpcode; if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); }; ?>
错误信息
0Error:couldn't open file "/tmp/phpWQLlLP.pdf"
问题排查及解决
核心问题分析
- 初始代码问题:直接将
$_FILES['testFile']数组传给CURLFILE,但CURLFILE需要的是文件路径字符串,导致无法正确识别文件,返回空数组。 - 更新后代码问题:错误地给临时文件名拼接了
.pdf后缀,实际上传的临时文件路径是$file['tmp_name'],加后缀后系统找不到该文件,触发"无法打开文件"错误。 - 额外问题:手动设置
Content-Type: multipart/form-data会覆盖CURL自动生成的正确边界参数,导致API无法解析请求体,应移除该头。
修正后的代码示例
<?php if ($_FILES['testFile']['error'] !== UPLOAD_ERR_OK) { die("文件上传失败,错误码:" . $_FILES['testFile']['error']); } $file = $_FILES['testFile']; $name = $_POST['testName']; $email = $_POST['testEmail']; runSend($file, $name, $email); function runSend($file, $name, $email){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.boldsign.com/v1/document/send'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); // 正确初始化CURLFILE,传入临时文件路径、原始MIME类型和文件名 $curlFile = new CURLFILE( $file['tmp_name'], $file['type'], $file['name'] ); $post = array( 'Title' => 'Commercial Agreement', 'Message' => 'Terms, purpose and duration of agreement ', 'UseTextTags' => 'true', 'EnableSigningOrder' => 'false', 'Signers[0][Name]' => $name, 'Signers[0][EmailAddress]' => $email, 'Signers[0][SignerOrder]' => '0', 'Signers[0][FormFields][0][FieldType]' => 'Signature', 'Signers[0][FormFields][0][Name]' => 'sign_field', 'Signers[0][FormFields][0][PageNumber]' => '1', 'Signers[0][FormFields][0][Bounds][X]' => '50', 'Signers[0][FormFields][0][Bounds][Y]' => '50', 'Signers[0][FormFields][0][Bounds][Width]' => '200', 'Signers[0][FormFields][0][Bounds][Height]' => '30', 'Signers[0][FormFields][0][IsRequired]' => 'true', 'Files' => $curlFile ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $headers = array(); $headers[] = 'Accept: application/json'; $headers[] = 'X-Api-Key: 你的API_KEY'; // 替换为实际API密钥 // 无需手动设置Content-Type,CURL会自动生成带正确边界的请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo '错误信息:' . curl_error($ch); } else { echo '响应结果:' . $result; echo 'HTTP状态码:' . curl_getinfo($ch, CURLINFO_HTTP_CODE); } curl_close($ch); }; ?>
关键修正点
- 正确实例化
CURLFILE:使用$file['tmp_name']作为文件路径,同时指定原始文件名和MIME类型,确保API能识别文件类型。 - 移除手动添加的
Content-Type: multipart/form-data头,避免覆盖CURL自动生成的边界参数,保证API能正常解析请求。 - 不修改临时文件名称,上传的临时文件路径就是
$file['tmp_name'],无需额外拼接后缀。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

