将“数据二进制”从cURL翻译为PHP

时间:2017-02-21 03:28:00

标签: php curl ibm-watson

我需要在PHP中重新创建它:

$request_headers = array();
$request_headers[] = 'Content-Type: text/plain;charset=utf-8';
$request_headers[] = 'Content-Language: en';
$request_headers[] = 'Accept-Language: en';

$simple_data = 'washingtonpost by the intelligence community';
    curl_setopt_array( $ch2, array(
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $simple_data,
        CURLOPT_HEADER => $request_headers,
        CURLOPT_USERPWD => 'XXXX:YYYY',
    )
    );
    $response2 = curl_exec( $ch2 );

我有这个:

--data-binary

我的代码没有考虑的是gdata.photos.service.GooglePhotosException: (501, 'Not Implemented', 'Insert is no longer supported') 部分,但我不确定如何将其“翻译”为PHP。另外,我可以使用纯文本数据二进制文件(API接受它)而不是JSON吗?

3 个答案:

答案 0 :(得分:2)

你所拥有的已经是--data-binary等价物。请参阅CURLOPT_POSTFIELDS API docs

  

您必须确保数据的格式与服务器接收数据的方式相同。 libcurl不会以任何方式为您转换或编码。

将其与docs for the command-line --data-binary option

进行比较
  

这完全按照指定发布数据,无需任何额外处理。

至于问题的第二部分:

  

我可以使用纯文本数据二进制文件(API接受它)而不是JSON

是的,来自命令行的--data-binary和来自API的CURLOPT_POSTFIELDS

答案 1 :(得分:0)

如果您将CURLOPT_POSTFIELDS的值设置为数组(如果您使用CURLFile,则将会为数组),则帖子将被格式化为多部分,从而破坏{ {1}}部分。

data-binary副作用的情况下,我找不到使用CURLFile的方法...

我使用的是这个,但是它使用的是multipart/form-data,它对内存不是很友好(它将整个文件加载到内存中):

file_get_contents

答案 2 :(得分:0)

好吧,我找到了一种无需multipart/form-data即可流式上传的方法,关键是欺骗卷发,首先我们告诉他PUT,然后告诉POST:

    <?php
    
    $file_local_full = '/tmp/foobar.png';
    $content_type = mime_content_type($file_local_full);

    $headers = array(
        "Content-Type: $content_type", // or whatever you want
    );

    $filesize = filesize($file_local_full);
    $stream = fopen($file_local_full, 'r');

    $curl_opts = array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_PUT => true,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_INFILE => $stream,
        CURLOPT_INFILESIZE => $filesize,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1
    );

    $curl = curl_init();
    curl_setopt_array($curl, $curl_opts);

    $response = curl_exec($curl);

    fclose($stream);

    if (curl_errno($curl)) {
        $error_msg = curl_error($curl);
        throw new \Exception($error_msg);
    }

    curl_close($curl);

积分:How to POST a large amount of data within PHP curl without memory overhead?