2017-07-19 77 views
0

我曾尝试使用CURL呼吁发送图像文件API。但我得到以下错误:卷曲状态码415是否有任何PHP.ini设置?

"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); 

回答

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为你写正确的代码没有设置。

+0

API只允许3种类型值IMAGE,VIDEO,FILES –

0

大多数的时候,你没有正确设置Content-Type的一个错误415出现。也许你可以把内容类型:

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

我已经设置 “内容类型:application/JSON;字符集= \” UTF-8 \ “”, –

+0

如果我设置为u建议我得到这个错误“无效内容类型报头“ –

+0

你能发送代码吗? –

0

I have solved using this solution

<?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();