2011-02-25 72 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