2009-10-27 26 views
1

我有一個開放的環境,沒有登錄,其中可以下載一些文件。我現在試圖設置一個等待時間功能和每個訪問者每個時間段類型的事件的帶寬限制(類似於Rapidshare之前曾經使用過的)。極限和等待時間喜歡Rapidshare

任何想法我應該如何去實現呢?我使用PHP,所以它的所有限制/優點(如果有的話)適用。

謝謝大家。

回答

4

如果沒有登錄系統,最好的做法是在固定的時間內限制每個IP地址下載一次。我相信這也是Rapidshare所做的。

實現此目的的最簡單方法是記錄IP地址以平面文件格式或數據庫開始下載的時間。如果從上一次下載時間起經過的時間少於所需的等待時間,則將用戶重定向到錯誤頁面。否則,將用戶重定向到下載鏈接。

漂亮的計數器只是一個JavaScript技巧。您可以使用Javascript計時器輕鬆編寫一個,但它只是用於演示。實際的下載能力應該始終由服務器決定(在你的情況下用PHP)。

1

試睡在downloader.php文件...

http://php.net/manual/en/function.sleep.php(設置超時之前設置的頭...文件類型)

它會強制頁面等待...並在鏈接到下載頁面的頁面,您可以放置​​一個JavaScript計數器來讓用戶知道...它應該在下載頁面運行時繼續運行,或者您可以將下載器文件放在新的頁面/窗口中,即作爲下載文件自動互動(x八位字節流文件類型... http://www.vbulletin.com/forum/showthread.php?70959-HTTP-Headers-to-force-file-to-download-rather-than-auto-open&s=f54c68f056a4c7f13762e43bcfe44fdc

您還可以使用會話來限制實際能夠在一定時間內訪問下載頁面,但這種方式更爲無用。

+0

使用sleep()會阻塞整個網頁直到腳本結束。會話很容易規避,因爲用戶可以強制請求新的會話cookie(例如重新啓動瀏覽器)。 – Kai 2009-10-27 04:12:24

5

我同意凱,但另一個解決方案可能是低速提供文件,您可以使用以下功能來做到這一點。

function Doo_Download($path, $speed = null) 
{ 
    if (is_file($path) === true) 
    { 
     set_time_limit(0); 

     while (ob_get_level() > 0) 
     { 
      ob_end_clean(); 
     } 

     $size = sprintf('%u', filesize($path)); 
     $speed = (is_null($speed) === true) ? $size : intval($speed) * 1024; 

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

     for ($i = 0; $i <= $size; $i = $i + $speed) 
     { 
      echo file_get_contents($path, false, null, $i, $speed); 

      flush(); 
      sleep(1); 
     } 

     exit(); 
    } 

    return false; 
} 
+0

我也可以隱藏遠程服務器/域上的文件嗎?所以絕對路徑如下:http://aremotedomain.com/somefolder/file.zip? – 3zzy 2012-11-26 02:32:03

+0

@Nimbuz:如果你運行PHP 5+,你應該可以,是的。 – 2012-11-26 02:39:05