以curl形式将原始图像数据作为multipart/form-data发布

 川妹-闲人_453 发布于 2023-01-26 03:16

我正在尝试使用multipart/form-data标头在PHP中使用cURL发布图像,因为我发送的API期望图像以多部分形式发送.

我在与其他请求谈论API时没有问题; 只发布图像是一个问题.

我在客户端使用此表单:

这是我发布的服务器(这里我试图将这些数据发布到API):

$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $imgRawData); // <-- raw data here hm?
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookieJar);
curl_setopt( $ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); <-- using this as I wanted to check if HTTPHEADER is set
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); <-- setting content-type header?
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);

// i get response from the server
$response = curl_exec( $ch );

// with this I can check what kind of content type the last request had?
$requestContentType = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);
echo "
request Content Type was:".$requestContentType."
"; curl_close($ch); echo "
SERVER POST IMAGE RESPONSE:
"; echo $response;

使用下面的代码,我可以看到我的请求标头:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

var_dump(curl_getinfo($ch));

请求标头中的内容类型现在正确显示.但似乎图像没有像API期望的那样正确发送.不幸的是我无法访问API ...

任何帮助表示感谢,谢谢

2 个回答
  • 从PHP 5.6开始@$filePath,CURLOPT_POSTFIELDS如果CURLOPT_SAFE_UPLOAD没有设置它将无法工作,它将在PHP 7中完全删除.您需要在此处使用CurlFile对象RFC.

    $fields = [
        'name' => new \CurlFile($filePath, 'image/png', 'filename.png')
    ];
    curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
    

    2023-01-26 11:05 回答
  • 如果任何人有同样的问题:检查这是@PravinS建议.我使用了完全相同的代码,它完全适合我.

    这是帮助的服务器代码的相关部分:

    if (isset($_POST['btnUpload']))
    {
    $url = "URL_PATH of upload.php"; // e.g. http://localhost/myuploader/upload.php // request URL
    $filename = $_FILES['file']['name'];
    $filedata = $_FILES['file']['tmp_name'];
    $filesize = $_FILES['file']['size'];
    if ($filedata != '')
    {
        $headers = array("Content-Type:multipart/form-data"); // cURL headers for file uploading
        $postfields = array("filedata" => "@$filedata", "filename" => $filename);
        $ch = curl_init();
        $options = array(
            CURLOPT_URL => $url,
            CURLOPT_HEADER => true,
            CURLOPT_POST => 1,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POSTFIELDS => $postfields,
            CURLOPT_INFILESIZE => $filesize,
            CURLOPT_RETURNTRANSFER => true
        ); // cURL options
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        if(!curl_errno($ch))
        {
            $info = curl_getinfo($ch);
            if ($info['http_code'] == 200)
                $errmsg = "File uploaded successfully";
        }
        else
        {
            $errmsg = curl_error($ch);
        }
        curl_close($ch);
    }
    else
    {
        $errmsg = "Please select the file";
    }
    }
    

    HTML表单应该类似于:

    <form action="uploadpost.php" method="post" name="frmUpload" enctype="multipart/form-data">
    <tr>
      <td>Upload</td>
      <td align="center">:</td>
      <td><input name="file" type="file" id="file"/></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td align="center">&nbsp;</td>
      <td><input name="btnUpload" type="submit" value="Upload" /></td>
    </tr>
    

    2023-01-26 12:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有