cURL中的data-binary参数

时间:2013-06-27 13:55:17

标签: php curl binary-data

我必须通过php中的cURL发送data-binary参数 这是命令: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);

服务器接受了该呼叫,但它无法识别 data-id 参数:

  

触发器2010-10-01_15-15-53

中未定义data-id属性

知道我缺少什么吗?

2 个答案:

答案 0 :(得分:5)

您需要先将字符串转换为流。

您只需使用这段代码即可。

$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 =&gt; $流

CURLOPT_INFILESIZE =&gt; $ DATALENGTH

CURLOPT_UPLOAD =&gt; 1

答案 1 :(得分:0)

为什么要将文本普通文本作为二进制文件?

--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