我试图在POST中使用cURL发送一个原始二进制文件和一些其他数据。基本上,我做到了:
//Here i create the CURLFile
$cfile = new CURLFile($fullpath,'application/xml', $filename);
//Data to upload (including the file)
$data_upload = array('username' => $username,
'password' => $password,
'owner' => $owner,
'destination' => $pathpda,
'filename' => $filename,
'filedata' => $cfile);
//Upload
$ch_upload = curl_init($urlws.$e_upload);
curl_setopt($ch_upload, CURLOPT_POST,true);
curl_setopt($ch_upload, CURLOPT_POSTFIELDS, $data_upload);
curl_setopt($ch_upload, CURLOPT_RETURNTRANSFER, true);
$response_upload = curl_exec($ch_upload);
curl_close($ch_upload);
一切都很好。除了现在我希望我的文件只是二进制数据,而不是磁盘上的真实文件。此外,我需要在请求中发送其他数据!有人知道怎么做吗?我在谷歌上查了一下,但没能找到同时发送原始二进制文件和其他数据的方法。谢谢
更新为了进一步澄清我的问题,我不需要只发送随机的二进制数据,而是一个内容来自ob_get_contents()的文件(例如),所以它不是磁盘上的物理文件。如果我只是用"filedata"变量替换CURL文件来发送二进制文件数据,那么它根本不起作用。web服务无法识别该文件。也许有一种方法可以在不指向真实文件的情况下创建CURL文件。
与处理其他变量的方式完全相同。最后,所有内容都以"二进制"的形式发送,或者实际上以字符串表示。
所以只要做
$content = ob_get_contents();
//or file_get_contents() or whatever source
$data_upload = array('username' => $username,
'password' => $password,
'owner' => $owner,
'destination' => $pathpda,
'filename' => $filename,
'filedata' => $cfile,
'allkindsofdata' => $content );
诀窍是将二进制字符串放入内存中的流中,然后告诉curl上传该流,使用:CURLOPT_INFILE、CURLOPT_INFILESIZE和CURLOPT_upload。这个答案提供了执行此操作的代码。