2014-07-14 36 views
0

例如:有一個提供文件下載的網站。網站和可下載文件位於不同的服務器上。當用戶嘗試下載文件時,文件服務器會改爲發送文件。文件服務器在到達用戶之前不應該首先將文件發送到網站的服務器,因爲這會使用兩倍的帶寬。Apache/PHP可以從另一臺服務器提供文件嗎?

可以使用PHP直接從文件服務器提供文件嗎?

注意:單個服務器設置可以簡單地使用PHP手冊中的以下代碼。我需要將這些標題從文件服務器直接發送給用戶。

<?php 
$file = 'monkey.gif'; 

if (file_exists($file)) 
{ 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 
?> 
+2

爲什麼不直接將用戶重定向到文件服務器?例如:他點擊了網站1上的一個按鈕,將他重定向到:http://website2/files/foo.bar? –

+0

也許:http://stackoverflow.com/questions/6086231/transfer-from-server-server-client-without-download-to-server/6086311#6086311也http:// stackoverflow。COM /問題/ 10991443 /捲曲得到遠程文件和力下載-AT-同一時間/ 10993094#10993094 –

回答

2

我看到幾個可能的解決方案。

1)它是安裝第二個服務器目錄到第一臺服務器在哪裏php正在運行。因此,您將從安裝的目錄中獲取文件並將其傳遞給用戶。

2)它發送給用戶而不是文件內容,但鏈接從另一臺服務器下載。例如使用重定向

header("Location: http://2nd-server-ip.com/myfile.zip"); 
0

爲什麼不使用cURL?

<?php 

$file = 'monkey.gif'; 

if (file_exists($file)) { 
    $ch = curl_init(); 
    $timeout = 5; 
    $headers = array('Content-Description' => 'File Transfer', 
     'Content-Type' => 'application/octet-stream', 
     'Content-Disposition' => 'attachment; filename=' . basename($file), 
     'Expires' => FALSE, 
     'Cache-Control' => 'must-revalidate', 
     'Pragma' => 'public', 
     'Content-Length' => filesize($file)); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    echo $data; 
} 
0

由於您打算通過PHP來做這個服務器端,我認爲您可以以多種方式來實現。

一般來說操作是由三個階段組成:

  1. 獲得所需的資源

  2. 讀入一個字符串(如果它足夠小)

  3. 即成它通過一個輸出流

diffe倫斯你正在尋找的是在第1階段,爲此,我可以找出以下替代現在:

  • 你的服務器和文件服務器共享至少是他們的文件系統,例如一部分與NFS。這樣文件服務器就可以導出下載目錄,並且您的web服務器的PHP腳本可以訪問可供下載的資源,就像您正在弄清楚的一樣;

  • 您的PHP腳本可以通過祕密(即服務器到服務器)身份驗證(例如通過其他人正確建議的cURL functions)通過(S)FTP或HTTP(S)訪問文件服務器所需的資源,以及作爲第二步,爲它服務。

希望這會有所幫助。

相關問題