2013-01-01 52 views
1

基本上,我有一個腳本登錄到網站並下載文件。非常坦率的。不幸的是,我的代碼中缺少某些功能,導致它無法正常工作。PHP:cURL:無法同時登錄和下載文件

當我運行它,我回來輸出到我的文件,這正是我會得到我的瀏覽器,如果我試圖訪問該文件的鏈接,而不登錄是在HTML頁面;訪問被拒絕,您必須登錄等。

但是,如果我通過註釋掉文件下載請求自行運行腳本的第一部分,然後重新運行腳本的全部內容,我可以我應該下載文件,所以我知道它在某種意義上是有用的。當我運行整個腳本時,它似乎並不想讓我登錄。

// Log me in 

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url); 
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location); 
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true); 
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

// Grab the file 

curl_setopt($handle, CURLOPT_URL, $csv_loc); 
curl_setopt($handle, CURLOPT_FILE, $csv_handle); 

echo $response = curl_exec($handle); 

curl_close($handle); 

所以我可以登錄,然後重新運行腳本並下載文件,但是我不能同時執行這兩個操作。我嘗試了各種不同的額外捲曲選項,例如COOKIEJAR和COOKIEFILE,以及FOLLOWLOCATION和REFERER,這是我唯一的直覺,因爲我的代碼爲什麼不起作用。東西在我的「搶檔」代碼是打破我的記錄中,或表現得像我沒有登錄

編輯:解決。

我已經決定把該解決方案,以便其他人避免我做了同樣的錯誤。

所有我需要做的是單獨的我的要求,像這樣;

// Log me in 

curl_setopt($handle, CURLOPT_URL, $login_url); 
curl_setopt($handle, CURLOPT_REFERER, $admin_url); 
curl_setopt($handle, CURLOPT_COOKIEJAR, $Cookie_Location); 
curl_setopt($handle, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($handle, CURLOPT_POST, true); 
curl_setopt($handle, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); 

echo $response = curl_exec($handle); 

// Grab the file 

curl_setopt($handle, CURLOPT_URL, $csv_loc); 
curl_setopt($handle, CURLOPT_FILE, $csv_handle); 

curl_exec($handle); 

curl_close($handle); 

首先,curl_exec將我登錄到站點,然後第二個人抓住並下載我的文件。然後我只需關上手柄。

+0

您可以在同一個腳本中創建兩個請求... –

回答

3

如果這正是你正在使用,那麼代碼:

// Log me in 
curl_setopt($handle, CURLOPT_URL, $login_url); 

// Grab the file 
curl_setopt($handle, CURLOPT_URL, $csv_loc); 

echo $response = curl_exec($handle); 
curl_close($handle); 

您正在重新定義您的網址。您無法在一個請求中發送POST到一個URL(登錄)和GET(獲取文件),您需要爲此發送兩個單獨的請求。

除非您的登錄表單,讓你馬上回來的文件作爲響應。

+0

我不太確定我關注。你的意思是創建一個完全獨立的請求並使用curl_init()處理?我剛剛嘗試過,並且基本上得到了HTTP 401錯誤,因爲我的腳本也使用簡單HTTP身份驗證。我似乎無法得到任何東西繼續我的第二個要求。 –

+0

看一看這樣的:http://stackoverflow.com/questions/2140419/how-do-i-make-a-request-using-http-basic-authentication-with-php-curl :) – favoretti

+0

其實,我已經有了我的簡單HTTP身份驗證,我只是沒有在我的問題中包含代碼。這是我在cURL中做的第一件事。我的觀點是,我似乎無法再運行第二個請求。它忘記了我在第一次請求中所做的一切,因此出現了401錯誤。 –