2010-09-01 98 views
1

我試圖通過curl發佈,我一直使用相同的代碼一遍又一遍沒有問題,但現在我需要能夠使用數組的帖子(我我不確定這是否有合適的名詞?)。使用PHP和Curl,深數組發佈

我應該澄清,它是一個特定的文件,我試圖發佈,但我無法得到它與一個字符串工作,所以我不認爲這是太過這樣做。

這是absouletly罰款:

 
$uploadData = array(); 
$uploadData['uploads'] = "@".$file; 
$uploadData['iagree'] = 'on'; 

不出現工作:

 
$uploadData = array(); 
$uploadData['uploads'][0] = "@".$file; 
$uploadData['iagree'] = 'on'; 

在第二個例子中,我試圖複製與屬性名稱的輸入=「上傳[]「

很顯然,我試圖蜷縮一個外部網站,但如果我在自己的服務器上實驗捲曲頁面,以便我可以看到正在發送的內容,則可以看到上傳的數組正在合併nverted字符串:

 
print_r($_POST); 
print_r($_FILES); 

回報:

 
Array 
(
    [uploads] => Array 
    [iagree] => on 
) 

Array 
(
) 

這是我的全部捲曲:

 
    $uploadData = array(); 
    $uploadData['uploads'][] = "@".$file; 
    $uploadData['iagree'] = 'on'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $theLink); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $uploadData); 
    $upload_response = curl_exec($ch); 
    curl_close($ch); 

我試圖給儘可能多的信息越好,但如果我」我錯過了一些可以隨意問的問題,我會提供更多。

除此之外,有沒有人有任何建議或解決方案?

回答

2

$uploadData['uploads[]'] = "@".$file;並傳遞它作爲數組應該工作,只要記住你需要文件的絕對路徑。

「簡單」HTTP(multipart/form-data或application/x-www-form-urlencoded)沒有機制發送數組。但是,PHP將鍵值對中的字符解釋爲特殊字符。 PHP是單獨在那個AFAIK中,它不是一個HTTP機制,它只是對輸入PHP的解析,就像用_替換.的值。 Curl是一個獨立於PHP的第三方包,因此不理解多維數組。

+0

Thankyou完美地工作,對於遲到的回覆感到抱歉。當我第一次發佈這個問題時是半夜:D – Rob 2010-09-02 11:12:23

0

嘗試通過查詢字符串:

$uploadData = 'uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $file2; 

看看是否能爲你工作。

編輯

通過人工閱讀,字符串需要進行url編碼,試試這個:

$uploadData = urlencode('uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $file2);

curl_setopt()手冊頁收到此信息

備註:

將數組傳遞給CURLOPT_POSTFIELDS會將數據編碼爲multipart/form-data,而傳遞URL編碼的字符串會將數據編碼爲application/x-www-form-urlencoded。

我可能已經使用不當的用urlencode,試試這個:

$uploadData = 'uploads[]=' . urlencode('@' . $file) . '&iagree=' . urlencode('on') . '&uploads[]=' . urlencode('@' . $file2); 

UPDATE

好吧,這是我在這最後一投。在curl頁面閱讀一些用戶註釋我發現了一些關於序列化子數組的內容。所以:

$uploadData = array('iagree' => 'on', 'uploads' => serialize(array('@' . $file))); 

希望這是關鍵。如果這不起作用......那麼可能無法做到。

給一個鏡頭,看看它是否工作。 (對不起,試驗和錯誤,我沒有一個方法來測試它!)

+0

發送字符串「@ root/to/my/testfile.zip」而不是實際的文件。但它確實將$ _POST作爲數組發送。 – Rob 2010-09-01 22:16:07

+0

根據http://www.php.net/curl_setopt手冊頁中的信息進行更新,因爲字符串需要使用urlencoded才能通過正確的編碼傳遞。 – 2010-09-01 22:22:56

+0

url編碼更糟,絕對沒有任何內容被髮布。我已經多次使用curl而沒有使用urlencoding,所以我不確定是否有必要。儘管如此,在這種情況下它並沒有幫助,但歡呼! – Rob 2010-09-01 22:26:31