2016-04-22 13 views
3

curl-putメソッドを使用してドキュメントをアップロードしようとしています。しかし、私はこのファイルを呼び出すときに、ファイルをアップロードしていない0バイトのファイルを生成します。curlを使用してファイルをアップロードするput-multipart/form-data

私は第三者のWebサービスを使用しています。

ここには何が欠けていますか?ヘッダに何かがありますか? file-nameでは、ファイル名またはパスを渡す必要がありますか?

PHPコード

 $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 

私は、オブジェクトを作成することにより、ファイルを送信しようとしました。この場合、以下のエラーが発生します。

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

エラー:MIMEマルチパートストリームの

予期しない終わり。 MIMEマルチパートメッセージは ではありません。

+2

真剣に、カールを気にしないでください。 [Composer](http://getcomposer.org)を入手し、[Guzzle](http://docs.guzzlephp.org/en/latest/quickstart.html#uploading-data)を使用します。 – ash

答えて

0

はこれを試してみてください:

ますcurl_setopt($ chを、CURLOPT_POSTFIELDS、http_build_query(配列( "身体" => $のBODY)));

または少なくともURLエンコード$ BODY。

関連する問題