在没有PHP用户干预的情况下发布multipart / form-data

时间:2011-02-25 22:03:48

标签: php http-post multipartform-data

我需要将一些XML数据发送到远程服务器进行处理。服务器协议已定义且不可更改。我想发布的XML数据是在本地服务器上运行的PHP页面中动态生成的。我不希望用户必须将该XML数据保存到文件中,然后浏览该文件以将其上载到远程服务器(这不是用户友好且毫无意义)。我的问题是如何使用PHP函数执行此操作(可以通过使用'input file ='字段编写HTML表单来执行此操作,但这意味着用户必须浏览该文件)。我得到了一个例子,我需要的是编写PHP代码,完全重现示例中的标题并将其发送到远程服务器。有什么线索可以帮助我吗?

POST http://doi.crossref.org/servlet/deposit?  operation=doMDUpload&login_id=USER&login_passwd=PSWD&area=live HTTP/1.1 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* 
Accept-Language: en-us Content-Type: multipart/form-data; boundary=---------------------------7d22911b10028e 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461) 
Host: Myhost 
Content-length: 1304 Pragma: no-cache -----------------------------7d22911b10028e 
Content-Disposition: form-data; name="fname"; filename="crossref_query.xml" 
<?xml version="1.0" encoding="UTF-8"?> 

.....XML data....

-----------------------------7d22911b10028e--

我尝试过的事情没有成功:XML数据的表单和输入=隐藏字段(POSTed数据不包含文件名,因此被远程服务器拒绝); http_post_data() - 只是在远程服务器上给了我一个内部服务器错误;在使用fopensocket之后,手工编码数据流并通过端口80套接字发送 - 服务器无法识别流包含POSTed表单数据,即使在检查了我发送的流之后,使用tcpdump逐个字符。所以你可以说,我已经绝望了!

2 个答案:

答案 0 :(得分:0)

from here...

 $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
    curl_setopt($ch, CURLOPT_URL, _VIRUS_SCAN_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    // same as <input type="file" name="file_box">
    $post = array(
        "file_box"=>"@/path/to/myfile.jpg",
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    $response = curl_exec($ch);

答案 1 :(得分:0)

所以你说用户打开了一个浏览器窗口,并且可以从本地服务器访问XML文件(我假设他们的浏览器可以通过http访问),并且你希望浏览器充当一种隧道将XML文件的内容传递到远程服务器?并且远程服务器无权访问该本地XML文件?

安全问题使得几乎无法做到。 (当你浏览时,你不希望雅虎从你的本地网络中随机抽取文件,对吗?)

只有在您可以控制本地服务器提供XML的方式时才能执行此操作。在这种情况下,您可以利用JSONP解决安全问题,并允许浏览器中的页面将数据作为AJAX帖子提交到远程服务器。