使用cURL发送原始二进制和数据

时间:2015-11-02 17:41:40

标签: php curl http-post binary-data raw-data

我正在尝试使用cURL在POST中发送原始二进制文件和其他一些数据。 基本上,我这样做了:

//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); 

一切都很好。除了现在我希望我的文件只是二进制数据而不是磁盘上的真实文件。另外,我需要在请求中发送其他数据! 有谁知道怎么做?我在Google上查了一下,但我找不到两种方法,发送原始二进制文件和其他数据。 谢谢!

UPDATE 为了进一步澄清我的问题,我不需要发送随机二进制数据,而是一个内容来自ob_get_contents()的文件(例如),因此它不是磁盘上的物理文件。如果我只是替换CURL文件以使用“filedata”变量发送二进制文件数据,它就不起作用。 Web服务无法识别该文件。也许有一种方法可以在不指向真实文件的情况下创建CURL文件。

2 个答案:

答案 0 :(得分:0)

与其他变量完全相同。 最后,所有内容都以"二进制"或实际上以字符串表示形式发送。

所以就这样做

$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 );

答案 1 :(得分:0)

诀窍是将二进制字符串放入内存中的stream,然后告诉curl上传该流,使用:CURLOPT_INFILE,CURLOPT_INFILESIZE和CURLOPT_UPLOAD。 This answer提供了执行此操作的代码。