php - 多部分表单文件上传 POST PHP cURL

标签 php api post curl multipartform-data

我想使用 PHP 和 cURL 通过 http POST 发送文件。

除了使用“application/json”发布的文件之外,表单 POST 可以正常使用基本字段。据我了解,这需要是多部分/形式的。

我收到的错误是 <b>Notice: Array to string conversion</b>上线
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

如果有人可以提供帮助,那就太好了!

PHP

$orgID = (is_numeric($_POST['orgID']) ? (int)$_POST['orgID'] : 0);
$noteTitle = (isset($_POST['noteTitle']) ? $_POST['noteTitle'] : null);
$noteBody = (isset($_POST['noteBody']) ? $_POST['noteBody'] : null);

if(isset($_FILES['file']['tmp_name'])){

    $ch = curl_init();
    $cfile = new CURLFILE($_FILES['file']['tmp_name'], $_FILES['file']['type'], $_FILES['file']['name']);
    $data = array();                

    $data["TITLE"] = "$noteTitle";
    $data["BODY"] = "$noteBody";
    $data["LINK_SUBJECT_ID"] = "$orgID";
    $data["LINK_SUBJECT_TYPE"] = "Organisation";        
    $data['FILE_ATTACHMENTS']['FILE_NAME'] = $_FILES['file']['name'];
    $data['FILE_ATTACHMENTS']['CONTENT_TYPE'] = $_FILES['file']['type'];
    $data['FILE_ATTACHMENTS']['URL'] = $_FILES['file']['tmp_name'];

    $localFile = $_FILES['file']['tmp_name'];
    $fp = fopen($localFile, 'r');       

    $headers = array(
        "authorization: Basic xxx",
        "cache-control: no-cache",
        "content-type: multipart/form-data",
        "postman-token: xxx"
    );

    curl_setopt($ch, CURLOPT_URL, "https://api.insight.ly/v2.1/Notes");
    curl_setopt($ch, CURLOPT_UPLOAD, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_NOPROGRESS,false); 
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch);

    if ($response === true) {
        $msg = 'File uploaded successfully.';    
    }
    else {
        $msg = curl_error($ch);         
    }

    curl_close ($ch);

    $return = array('msg' => $msg);

    echo json_encode($return);
}

HTML

<form method="POST" action="formSend.php" enctype="multipart/form-data">
    <input type="text" value="" name="orgID">
    <input type="text" value="" name="noteTitle">
    <input type="text" value="" name="noteBody">  
    <input name="file" type="file" id="file"/>
    <input type="submit" value="Submit" name="btnUpload"/>
</form>

最佳答案

嗨,我已经解决了这个问题。

我的 api 端点上的参数设置不正确。需要设置一个note_id(c_id)

但是我现在遇到的问题是一次发布所有数据。我在创建注释后发布文件,从而为我生成用于发布文件的注释 ID。有人可以帮忙吗?我可以发布一个新问题。

请参阅下面更新的代码:

//$orgID = (is_numeric($_POST['orgID']) ? (int)$_POST['orgID'] : 0);
//$noteTitle = (isset($_POST['noteTitle']) ? $_POST['noteTitle'] : null);
//$noteBody = (isset($_POST['noteBody']) ? $_POST['noteBody'] : null);

$noteID = (isset($_POST['noteID']) ? $_POST['noteID'] : null);

$localFile = $_FILES['file']['tmp_name'];
$fp = fopen($localFile, 'r');

$curl = curl_init();

$cfile = new CURLFILE($_FILES['file']['tmp_name'], $_FILES['file']['type'], $_FILES['file']['name']);
$data = array();                
//$data["TITLE"] = "$noteTitle";
//$data["BODY"] = "$noteBody";
//$data["LINK_SUBJECT_ID"] = "$orgID";
//$data["LINK_SUBJECT_TYPE"] = "Organisation";        
$data['FILE_ATTACHMENTS'] = $cfile;

curl_setopt_array($curl, array(
  CURLOPT_UPLOAD => 1,
  CURLOPT_INFILE => $fp,
  CURLOPT_NOPROGRESS => false, 
  CURLOPT_BUFFERSIZE => 128,
  CURLOPT_INFILESIZE => filesize($localFile),
  CURLOPT_URL => "https://api.insight.ly/v2.1/Notes/?c_id=" . $noteID . "&filename=" . $_FILES['file']['name'],
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $data,      
  CURLOPT_HTTPHEADER => array(
    "authorization: Basic xxx",
    "cache-control: no-cache",
    "content-type: multipart/form-data",
    "postman-token: xxx"
  ),
));
$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

HTML

<form method="POST" action="formSend.php" enctype="multipart/form-data">
    //<input type="text" value="" name="orgID">
    //<input type="text" value="" name="noteTitle">
    //<input type="text" value="" name="noteBody"> 
    <input type="text" value="" name="noteID">
    <input name="file" type="file" id="file"/>
    <input type="submit" value="Submit" name="btnUpload"/>
</form>

如果有人感兴趣,这是我的解决方案,使用 fpdf 从网络表单生成 PDF 文档,然后自动发送,而不是文件上传。 FPDF file ---> send via CURL automatically NOT with file upload

关于php - 多部分表单文件上传 POST PHP cURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34604602/

相关文章:

php - 在文件夹中使用 .htaccess 隐藏查询字符串

django - 从 django-rest 在 flutter 应用程序中获取正确的数据

javascript - 数组推送结果为空数组javascript

php - 动态定价计算,其中每个单位逐渐变得比之前的单位便宜

php - 如何在 PHP 中为上传的文件创建下载链接

python - gdata youtube api 302 'The document has moved'

java - 在同一个 Servlet 中获取和发布

facebook - 打开图 : custom properties not showing in post

ios - 如何在post方法ios中向服务器请求数据?

php - Jquery 在提交后显示一次