【问题标题】:Image upload CURL command to PHP Curl图像上传 CURL 命令到 PHP Curl
【发布时间】:2016-03-31 07:40:25
【问题描述】:

我对 PHP CURL 很陌生,并试图调用 API 来进行图像上传(一次多个文件)。 API 文档在 CURL 中给出了以下示例。我已经测试过了,它正在工作。

curl -H "Authorization: Bearer 123456789" -i -X POST -F "whitespace=1" \
 -F "imageData[]=@/path/to/images/milk.jpg" \
 -F "imageData[]=@/path/to/images/peas.jpg" \
 https://mytestapi.com/1.0/uploadimages

现在我需要将其转换为 PHP Curl。出于某种原因,我总是收到错误“imageData”参数无效。有人可以帮忙吗

$token = '123456789';
$imgUrl = 'https://mytestapi.com/1.0/uploadimages';


$data_to_post = array();
$data_to_post['whitespace'] = '1';
$data_to_post['imageData[]'] = '@/path/to/images/milk.jpg';
$data_to_post['imageData[]'] = '@/path/to/images/peas.jpg';


$curl = curl_init($imgUrl);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$token]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl,CURLOPT_POST, 1);
curl_setopt($curl,CURLOPT_POSTFIELDS, $data_to_post);
$data = json_decode(curl_exec($curl));
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

var_dump($data);

【问题讨论】:

  • 你会给谁赏金
  • 感谢赏金。如果你愿意,你可以投票

标签: php curl libcurl image-upload


【解决方案1】:

尝试给出图片的完整路径而不是'@/path/to/images/milk.jpg';

这里是更新的代码:

$token = '123456789';
$imgUrl = 'https://mytestapi.com/1.0/uploadimages';


$data_to_post = array();
$data_to_post['whitespace'] = '1';
$data_to_post['imageData'][] = "@".$imgUrl.'/path/to/images/milk.jpg';
$data_to_post['imageData'][] = "@".$imgUrl.'/path/to/images/peas.jpg';


$curl = curl_init($imgUrl);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$token]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl,CURLOPT_POST, 1);
curl_setopt($curl,CURLOPT_POSTFIELDS, $data_to_post);
$data = json_decode(curl_exec($curl));
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

var_dump($data);

如果这不起作用,请告诉我。

【讨论】:

  • 不适用于完整路径。无论如何 $imgUrl 是 API URL,所以你的代码将它附加到图像文件名没有意义?无论如何,我现在能够使用 php curl file create 修复它
【解决方案2】:

我自己解决了这个问题。必须使用 php curl file create 来使其工作,而不是附加 '@'

http://www.php.net/manual/es/function.curl-file-create.php

【讨论】:

    【解决方案3】:

    如何使用 PHP cURL 上传文件

    <?php 
    
    // Helper function courtesy of https://github.com/guzzle/guzzle/blob/3a0787217e6c0246b457e637ddd33332efea1d2a/src/Guzzle/Http/Message/PostFile.php#L90
    function getCurlValue($filename, $contentType, $postname)
    {
        // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax
        // See: https://wiki.php.net/rfc/curl-file-upload
        if (function_exists('curl_file_create')) {
            return curl_file_create($filename, $contentType, $postname);
        }
    
        // Use the old style if using an older version of PHP
        $value = "@{$this->filename};filename=" . $postname;
        if ($contentType) {
            $value .= ';type=' . $contentType;
        }
    
        return $value;
    }
    
    $filename = '/path/to/file.jpg';
    $cfile = getCurlValue($filename,'image/jpeg','cattle-01.jpg');
    
    //NOTE: The top level key in the array is important, as some apis will insist that it is 'file'.
    $data = array('file' => $cfile);
    
    $ch = curl_init();
    $options = array(CURLOPT_URL => 'http://your/server/api/upload',
                 CURLOPT_RETURNTRANSFER => true,
                 CURLINFO_HEADER_OUT => true, //Request header
                 CURLOPT_HEADER => true, //Return header
                 CURLOPT_SSL_VERIFYPEER => false, //Don't veryify server certificate
                 CURLOPT_POST => true,
                 CURLOPT_POSTFIELDS => $data
                );
    
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    $header_info = curl_getinfo($ch,CURLINFO_HEADER_OUT);
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($result, 0, $header_size);
    $body = substr($result, $header_size);
    curl_close($ch);
    
    ?>
    
    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>File Upload results</title>
    </head>
    <body>
        <p>Raw Result: <?=$result?>
        <p>Header Sent: <?=$header_info?></p>
        <p>Header Received: <?=$header?></p>
        <p>Body: <?=$body?></p>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2019-06-04
      相关资源
      最近更新 更多