4

I am trying to upload document via curl-put method. But when I call this file its just generate 0 byte file not uploading file.

I am consuming third party's web service.

What is missing here ?Is there something in header ? In file-name do we need to pass file-name or path ?

PHP Code

        $data = json_encode($this->data);
        $file_url = $filepath;
        $f = array($filepath);

        $eol = "\r\n";
        $BOUNDARY = md5(time());
        $BODY=""; //init my curl body
        $BODY.= '--'.$BOUNDARY. $eol; //start param header
        $BODY .= 'Content-Disposition: form-data; name="Appointment"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content.           
        $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
        $BODY.= 'Content-Disposition: form-data;  filename='.$filepath. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance
        $BODY.= 'Content-Type: application/pdf' . $eol; //Same before row      
        $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data,
        $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.

        $header[] = 'Authorization: WRAP access_token="'.$this->accesstoken.'"';
        $header[] = 'Content-Type: multipart/form-data; boundary='.$BOUNDARY;
        print_r($BODY);         
        $ch = curl_init();              
        curl_setopt($ch, CURLOPT_URL,$this->baseAddress);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');  // tell curl you want to post something
        curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // define what you want to post
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER,$header); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_ENCODING, '');
        curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);     
        $output = curl_exec ($ch); // execute
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($output, 0, $header_size);
        $this->response = substr($output, $header_size);
        $info = curl_getinfo($ch);
        $this->responsecode = $info['http_code'];           
        curl_close ($ch); // close curl

I also tried to send file by creating object. In this case it gives below error.

$cfile = new CURLFile(realpath('testcp.txt'),'text/plain');
        $uploadPost = array (
            'file' => $cfile
         );         
        $eol = "\r\n";
        $BOUNDARY = md5(time());
        $BODY=""; //init my curl body
        $BODY.= '--'.$BOUNDARY. $eol; //start param header    

        $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
        $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.

            $header[] = 'Authorization: WRAP access_token="'.$this->accesstoken.'"';
            $header[] = 'Content-Type: multipart/form-data; boundary='.$BOUNDARY;
            print_r($BODY);
            //ECHO $this->accesstoken;EXIT;
            $ch = curl_init();  
            //echo $this->baseAddress;exit;
            curl_setopt($ch, CURLOPT_URL,$this->baseAddress);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');  // tell curl you want to post something
    //      curl_setopt($ch, CURLOPT_POSTFIELDS, ($data)); // define what you want to post
            curl_setopt($ch, CURLOPT_POSTFIELDS, $uploadPost); // define what you want to post
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER,$header); 
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_HEADER, 1);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);     

            $output = curl_exec ($ch); // execute
            echo 'OUTPUT ---';print_r($output);exit;        
            curl_close ($ch);

Error :

Unexpected end of MIME multipart stream. MIME multipart message is not complete.

1
  • 2
    Seriously, don't bother with Curl. Get Composer and use Guzzle - Otherwise use guzzle anyway. Commented Apr 22, 2016 at 9:56

1 Answer 1

0

Try this:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("body" => $BODY)));

Or at least URL-encode $BODY;

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.