двоичный параметр данных в cURL

Мне нужно отправить двоичный параметр данных через cURL в php.
Это команда: curl -D - -u user:password -X PUT -H "Content-Type: text/plain" --data-binary "data-id=2010-10-01_15-15-53" https://someurl . В консоли это работает, теперь я должен сделать это в php.

Это код, который у меня есть:

  $this->_curl = curl_init(); curl_setopt($this->_curl, CURLOPT_USERPWD, $this->_loginUser . ":" . $this->_loginPassword); curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->_curl, CURLOPT_HEADER, 1); curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($this->_curl, CURLOPT_TIMEOUT, 30); curl_setopt($this->_curl, CURLOPT_URL, $this->_serviceUrl);//https://someurl curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); curl_setopt($this->_curl, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($this->_curl, CURLOPT_POSTFIELDS, array('data-id' => $dataId));//d'2010-10-01_15-15-53' $response = curl_exec($this->_curl); //$response = HTTP/1.1 201 Created curl_close($this->_curl); 

вызов принимается сервером, но он не распознает параметр идентификатора данных :

Не определено свойство идентификатора данных в триггере 2010-10-01_15-15-53

Любая идея, что мне не хватает?

Сначала вам нужно преобразовать строку в поток.

Вы можете просто сделать это с помощью этого фрагмента кода.

 $YourString = 'data-id=2010-10-01_15-15-53'; $stream = fopen('php://memory','r+'); fwrite($stream, $YourString ); $dataLength = ftell($stream); rewind($stream); 

Затем, имея свой поток, вы можете отправить его с помощью curl.

 $curl = curl_init(); curl_setopt_array( $curl, array( CURLOPT_CUSTOMREQUEST => 'PUT' , CURLOPT_URL => 'https://someurl' , CURLOPT_HTTPHEADER => array( 'Content-Type: text/plain' ) , CURLOPT_RETURNTRANSFER => 1 // means output will be a return value from curl_exec() instead of simply echoed , CURLOPT_TIMEOUT => 15 // max seconds to wait , CURLOPT_FOLLOWLOCATION => 0 // don't follow any Location headers, use only the CURLOPT_URL, this is for security , CURLOPT_FAILONERROR => 0 // do not fail verbosely fi the http_code is an error, this is for security , CURLOPT_SSL_VERIFYPEER => 1 // do verify the SSL of CURLOPT_URL, this is for security , CURLOPT_VERBOSE => 0 // don't output verbosely to stderr, this is for security , CURLOPT_INFILE => $stream , CURLOPT_INFILESIZE => $dataLength , CURLOPT_UPLOAD => 1 ) ); $response = curl_exec($curl); $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); echo($response.'<br/>'); echo($http_code.'<br/>'); 

Это должно сработать. Строки, которые вам помогут, выделены ниже:

CURLOPT_INFILE => $ stream

CURLOPT_INFILESIZE => $ dataLength

CURLOPT_UPLOAD => 1

Почему вы хотите передать текст как двоичный?

 --data-binary "data-id=2010-10-01_15-15-53" 

В этой строке вы говорите, что хотите передать простой текст, а не двоичный:

 curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); 

В любом случае, я думаю, ваша основная проблема заключается в использовании метода PUT. ( https://stackoverflow.com/a/8054241/333061 )

Я рекомендую использовать метод POST таким образом:

 curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array( 'Accept: */*', 'Connection: Keep-Alive', // this allows you transfer binary data through POST 'Content-type: multipart/form-data' )); curl_setopt($this->_curl, CURLOPT_POST, 1); curl_setopt($this->_curl, CURLOPT_POSTFIELDS, http_build_query(array('data-id' => $dataId))); 

Чтобы легко передать двоичные данные с помощью curl / php, проверьте это: https://stackoverflow.com/a/3086357/333061