我需要在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吗?
答案 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?