是否有curl状态代码415的PHP.ini设置?

时间:2017-07-19 07:13:51

标签: php curl

我尝试使用CURL为发送图像文件调用API。但是我收到以下错误:

"statusCode":415,
"error":"Unsupported Media Type"

请帮帮我。

我在这里附上了代码:

$filename = "screenshot.jpg";
$handle = fopen($filename, "r");
$xml = fread($handle, filesize($filename));
fclose($handle);
 $jwt_token = "xxx";
$authorization = "Authorization:".$jwt_token;
$url = "https://prod0-commerce-api.sprinklr.com/media_upload";
$headers = array(             
                            "Content-Type: image/jpg]",
                            "Cache-Control: no-cache", 
                            "Pragma: no-cache", 
                            $authorization
                            ); 
$postdata = array('fileName' => '@'.$filename,
            'type' => 'IMAGE'); //<-------------

        $soap_do = curl_init(); 
        curl_setopt($soap_do, CURLOPT_URL,            $url);   
        //curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 60); 
        //curl_setopt($soap_do, CURLOPT_TIMEOUT,        60); 
        curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
        curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);  
        //curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
        curl_setopt($soap_do, CURLOPT_POST,           true ); 
        curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $postdata); //<----------- 
        curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $headers); 

        $result = curl_exec($soap_do);
        // Check for errors and display the error message
        curl_close($soap_do);
        $httpcode = curl_getinfo($soap_do, CURLINFO_HTTP_CODE);
        echo $httpcode;
echo "<pre>";
var_dump($result);
if($errno = curl_errno($soap_do)) {
    $error_message = curl_strerror($errno);
    echo "cURL error ({$errno}):\n {$error_message}";
}
echo "string";exit();
        print_r($result); 

3 个答案:

答案 0 :(得分:1)

问题在于此块:

$postdata = array('fileName' => '@'.$filename,
                  'type' => 'IMAGE'); //<-------------

type的值应为有效的MIME type(又称“媒体类型”或“内容类型”)。

MIME类型是由斜杠(/)连接的两部分(类型和子类型)组成的标识符。

该类型标识内容的类别(文本,图像,音频,视频,应用程序等)。子类型标识该类别内的内容更准确。

对于图片,类型为image,并且有几种子类型:gifjpegpng等。

图片文件的正确MIME类型看起来像image/jpegimage/png,而不只是IMAGE。这就是服务器拒绝您的查询的原因。

PHP函数getimagesize()可用于查找存储在文件中的图像的MIME类型。

您的代码应该是这样的:

$imgInfo = getimagesize($filename);
$postdata = array('fileName' => '@'.$filename,
                  'type' => $imgInfo['mime']);

不,php.ini中没有为您编写正确代码的设置。

答案 1 :(得分:1)

  

我已经解决了使用此解决方案的问题

<?php

$file = "http://localhost/xxx/screenshot.jpg";
$boundary = md5(time());
$eol = "\r\n"; 
$params  = "----".$boundary.$eol
    . "Content-Disposition: form-data;name=\"type\"".$eol
    . $eol
    . "IMAGE"
    . $eol
    . "----".$boundary.$eol
    . "Content-Disposition: form-data;name=\"file\"; filename=\"screenshot.jpg\"".$eol
    . '"Content-Type: image/jpeg\"'.$eol
    . $eol
    . file_get_contents($file) .$eol
    . "----".$boundary."--";

$jwt_token = "xxxx";
$authorization = "Authorization:".$jwt_token;

$first_newline      = strpos($params, $eol);
$multipart_boundary = substr($params, 2, $first_newline - 2);
$request_headers    = array();
$request_headers[]  = $authorization;
$request_headers[]  = 'Accept: application/json';
$request_headers[]  = 'Content-Length: ' . strlen($params);
$request_headers[]  = 'Content-Type: multipart/form-data; boundary='. $multipart_boundary;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'xxx');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
 $result = curl_exec($ch);
 $info = curl_getinfo($ch);


curl_close($ch);
  echo "<pre>";
print_r($result);

exit();

答案 2 :(得分:0)

大部分时间如果您没有正确设置内容类型,则会出现错误415. 也许您可以输入内容类型:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: image/jpg"));