2011-02-25 44 views
0

多部分/格式数据而无需用户干预我需要一些XML POST数据到用于处理的远程服务器。服务器协议已经定义并且不可更改。我想发布的XML数据是在本地服务器上运行的PHP页面中动态生成的。我不希望用户必须将该XML数据保存到文件中,然后浏览该文件以将其上传到远程服务器(这不是用户友好且毫无意义的)。我的问题是如何使用PHP函数完成此操作(可以通过使用'input file ='字段编码HTML表单来完成此操作,但这意味着用户必须浏览该文件)。我一直在考虑一个例子,我需要的是编写PHP代码,将正是再现头的例子,并将其发送到远程服务器。任何帮助我的线索?发布信息有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数据隐藏字段(发布数据不包括文件名,因此是由远程服务器拒绝); http_post_data() - 刚在远程服务器给我一个内部服务器错误;手动编码数据流,并在使用fopensocket后通过端口80套接字发送它 - 即使在使用tcpdump逐字检查我发送的数据流之后,服务器也无法识别数据流是否包含POST数据。所以你可以说,我越来越绝望了!

回答

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

所以你说用户有一个浏览器窗口中打开,并有从本地服务器访问的XML文件(我假设他们的浏览器可以通过HTTP访问),和你想让浏览器充当一种隧道来将XML文件的内容传递给远程服务器?远程服务器无法访问该本地XML文件?

安全问题,使这个几乎不可能做到的。 (你不会希望雅虎拉随机文件从你的本地网络,当你浏览,对吧?)

,如果你有超过本地服务器提供的XML的方式的一些控制它只能完成。在这种情况下,您可以利用JSONP来解决安全问题,并允许浏览器中的页面将数据作为AJAX帖子提交给远程服务器。

+0

你的总结几乎是正确的:XML是不是一个文件,而是产生(由PHP代码)在内存中(特别是,使用$作家=新XMLWriter的();写入器的$> openMemory(); ...东西来创建XML ... $ xml = $ writer-> outputMemory();),所以安全问题不像你想象的那么严重。生成了XML后,我希望PHP页面能够将它传送到远程服务器。 – Nigel 2011-02-26 12:36:14

+0

@micrology:啊,所以你控制的本地服务器能够连接到远程服务器。远程服务器接受通过HTTP发送的文件上传,但不要求您在用户的会话或任何内容上进行身份验证。你只需要做一个http post来发送XML内容,就好像你的本地服务器是一个浏览器上传一个XML文件一样。如果所提供的'curl'方法FatherStorm不起作用,你可以试试这个:http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl(如果确实如此工作,一定要接受他的回答)。 – StriplingWarrior 2011-02-27 02:07:37