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

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"
问题排查及解决

核心问题分析

  1. 初始代码问题:直接将$_FILES['testFile']数组传给CURLFILE,但CURLFILE需要的是文件路径字符串,导致无法正确识别文件,返回空数组。
  2. 更新后代码问题:错误地给临时文件名拼接了.pdf后缀,实际上传的临时文件路径是$file['tmp_name'],加后缀后系统找不到该文件,触发"无法打开文件"错误。
  3. 额外问题:手动设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:03:08