2015-06-17 42 views
0

我想用php來發布變量到遠程服務器上的另一個php和遠程服務器上的文件我想讀取該文件並強制其下載。遠程服務器上的文件不在公用文件夾中,這就是爲什麼我需要首先調用該文件,以便驗證並獲取受保護的文件。PHP - 使用CURL來驗證和下載遠程文件

一切正常,但我沒有得到任何文件。

在遠程PHP我使用標準的讀取文件和標題來下載文件。

我想也許問題是與CURL設置,我使用標準CURL調用是否有任何特定的標題或設置我需要使用時,我打電話CURL有文件下載?

這是我使用

$request = curl_init(); 
curl_setopt($request, CURLOPT_URL, $postURL); 
curl_setopt($request, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($request, CURLOPT_VERBOSE, 0); 
curl_setopt($request, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($request, CURLOPT_POST, 1); 
curl_setopt($request, CURLOPT_POSTFIELDS, $postFields); 
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($request); 
curl_close($request); 

其中$ postFields包含變量進行身份驗證並確認其他服務器上的文件捲曲。

在其他的服務器認證後的PHP並正常力下載:

header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename="'.$newFileName.'"'); 
header('Content-Type: application/octet-stream'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . filesize($path)); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Expires: 0'); 

readfile($path); 

謝謝!

編輯: 嗨,我相信我找到了問題。問題是,當我叫過。$張貼在jQuery的本地服務器的PHP,捲曲中斷Ajax調用

 $.post('local.php', $(this).serialize(), function(data){ 
      alert(data); 
      } 
     }, "json").fail(function() { 
      alert('error'); 
     }); 

所以我必須弄清楚如何通過jQuery的地方打電話。 PHP沒有打破過程。 感謝您的幫助!

+0

請添加您已獲得的相關代碼(特別是捲曲初始化,即使它不工作)。這樣我們就可以更好地理解你想要達到的目標/問題所在。 – dhh

+0

嗨@dhh我更新了代碼。謝謝! – Kitara

+0

@Kitara,你如何獲得'$ newFileName'和'$ path'變量?如果你把一個'print_r($ response)',輸出是什麼? –

回答

1

假設您在目標站點上使用基本HTTP身份驗證 - 您可以使用選項CURLOPT_USERPWD添加登錄信息。

curl_setopt($request, CURLOPT_USERPWD, "$username:$password"); 

編輯:對於AJAX調用 - jQuery將執行fail方法,如果服務器返回一個錯誤。此外 - 您在ajax調用中將數據類型指定爲json。我認爲下載不會返回json。

編輯2:我不認爲通過$.post下載將是可能的方式,因爲jQuery的只知道的xmlhtmlscriptjsonjsonptext之一。您可以嘗試通過您的ajax請求進行身份驗證,讓ajax響應返回下載URL將瀏覽器重定向到該目標。或者您可以嘗試使用隱藏的iframe進行下載。看看這些帖子(herehere) - 這裏詳細討論這個問題。

+0

嗨@dhh請看我對這個問題的編輯。謝謝你的幫助。但看起來我必須稍微改變一下這個過程!謝謝! – Kitara

+0

嗨,謝謝你的eidt。什麼是所需的返回類型?謝謝! – Kitara

+0

謝謝,這有助於很多,我相信這是正確的方向。 – Kitara