我見過很多關於如何用cURL上傳文件(Send file with cURL可能與我所需要的距離最接近)的示例,但無論出於何種原因,我的腳本無法正常工作。通過CURL從CURLed頁面上傳文件到另一個服務器
我試圖實現的目標:從SERVER2捲曲文件上傳表單,將其顯示在SERVER1上。通過此表單選擇要上傳的文件,提交表單,但將其提交給SERVER1,獲取$ _POSTS和$ _FILES,然後在SERVER2上提交表單處理腳本並將結果顯示在SERVER1中。
換句話說,我在SERVER2上有一個工作文件上傳和處理接口,但我需要讓它看起來像是在SERVER1上發生的一切。
這是我作爲遠在Server1上的相關代碼:
//loop through submitted files
foreach ($_FILES as $k => $v) {
$settings[$k] = '@'.$v['tmp_name'];
}
$settings = http_build_query($settings);
$cookie= WP_CONTENT_DIR.'/plugins/myPlugin/cookie.txt';
//SERVER1 is a WORDPRESS site
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $settings);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url);
$response = curl_exec($ch);
當我輸出$響應(其中包括的print_r($ _ FILES)),文件提出了一個空數組及以下產生錯誤:警告:file_get_contents(@/tmp/phpFITW6K):未能打開流:沒有這樣的文件或目錄。
我錯過了什麼?我發現某些cURL示例中缺少http_build_query,而是傳遞了一個數組,但我得到了「不允許請求數據和POST請求,或者請求中提供的數據量超出了容量限制。」如果我刪除了http_build_query行。
任何幫助,將不勝感激。
謝謝!
'警告:file_get_contents(@/tmp/phpFITW6K):' - 爲什麼在文件路徑中有'@'符號? – Twisted1919
我相信這是因爲$ settings [$ k] ='@'。$ v ['tmp_name']; 。據我瞭解,我需要@傳遞一個文件?這是我在我回顧的例子中找到的東西。如果我從$ settings [$ k] ='@'中刪除了@ @ $ ['tmp_name'];那麼錯誤信息沒有,但仍然無法打開文件。 –
不要做http_build_query()。 curl完全願意接受一個表單字段的數組,並且它會自己創建。您還假設上傳工作進入您的服務器。在嘗試將它們傳遞到其他服務器之前,您需要檢查它們是否成功。 –