2015-11-02 134 views
3

我想在POST中发送一个原始的二进制文件以及其他一些使用cURL的数据。 基本上,我这样做:用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); 

一切工作正常。除此之外,我希望我的文件只是二进制数据而不是磁盘上的真实文件。另外,我需要发送请求中的其他数据! 有谁知道该怎么做?我抬头看着谷歌,但我无法找到一种方法来发送原始二进制文件和其他数据。 谢谢!

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

+0

你的问题是如何发送光盘上不是真实文件的数据? – fico7489

+0

我的问题是如何发送未保存在服务器磁盘上的文件(例如从数据库检索到的文件或ob_get_contents()的输出)以及使用cURL的其他常用后期数据。 – greg

+0

按照'FILE'这个词的定义,它被存储在一个'文件夹中的磁盘上,否则它只是内容。文件和文件系统只是数据存储的范例,您只需发送与发送用户名字符串不同的内容。 –

回答

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); 
+0

感谢您的回复,但它只是不起作用。我想发送的是一个文件,而不仅仅是二进制内容。 Web服务不断回答“所需请求部分”filedata'不存在“。 我也尝试手动添加头“Content-Type:multipart/form-data”,并设置选项CURLOPT_HEADER,CURLOPT_HTTPHEADER,CURLOPT_INFILESIZE而没有结果。 在我的第一个实现中,我创建了一个CURL文件。如果我可以使用ob_get_contents()的输出创建相同的CURL文件,而不是引用磁盘上的真实文件,那将会很棒。但我不认为这可以这样做。 – greg

+0

但是,你如何定义一个文件,你说内容可能来自一个文件,但你不想将它作为一个文件发送?所以基本上你试图做的是将文件存储在变量中并发送它? (否?),我建议你不要发送'filename'和'filedata',而只是将内容作为普通的POST变量发送。 –

+0

好吧,让简单。我需要将'$ data_upload'变量中的数据发送到Web服务。如果我用'ob_get_contents()'输出替换了CURL文件,那么web服务会回应一个例外'400,“错误”:“错误的请求”“所需的请求部分'filedata'不存在。也许我需要添加一个选项到我不知道的curl_setopt。我需要帮助。您不幸提出的解决方案不起作用。 – greg

0

诀窍就是让你的二进制字符串到内存中的一个stream然后告诉卷曲上载流,使用:CURLOPT_INFILE,CURLOPT_INFILESIZE和CURLOPT_UPLOAD。 This answer提供了执行此操作的代码。