Kshitij Soni
Kshitij Soni

Reputation: 394

Is there any PHP.ini setting for curl status code 415?

I have tried to call API for send image file using CURL .But I am getting below error:

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

Please help me.

I have attached code here:

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

Upvotes: 0

Views: 323

Answers (3)

Kshitij Soni
Kshitij Soni

Reputation: 394

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

Upvotes: 1

axiac
axiac

Reputation: 72226

The problem is in this block:

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

The value of type should be a valid MIME type (aka "media type" or "content type").

A MIME type is an identifier composed of two parts (the type and the subtype) joined by slash (/).

The type identifies the category of content (text, image, audio, video, application etc). The subtype identifies more accurate the content inside the category.

For images, the type is image and there are several subtypes: gif, jpeg, png etc.

A correct MIME type for an image file looks like image/jpeg or image/png and not just IMAGE. This is why the server rejects your query.

The PHP function getimagesize() can be used to find the MIME type of a image stored in a file.

Your code should be like this:

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

And no, there is no setting in php.ini that writes correct code for you.

Upvotes: 1

GoA Oz
GoA Oz

Reputation: 328

Most of time a error 415 appears when you don't set properly the Content-Type. Maybe you can put Content-Type:

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

Upvotes: 0

Related Questions