2013-05-21 45 views
-1

我正在創建一個網站,允許用戶通過JavaScript插件查看文件。Php複製CPU消耗

要做到這一點,並保持文件的安全性,每次訪問JavaScript插件時,我都會創建原始文件的一次性唯一副本。

原始文件最大爲30mb,這將如何擴展系統的多個用戶?說100個人是否要創建並訪問該文件的副本。

+3

只要不使用寫訪問,我無法想象使用原始文件會不安全的情況嗎? – bwoebi

+0

@bwoebi什麼OP提到可能會有用的情況下,有人會創建一個服務提供音樂/聲音,但要確保他們不能複製粘貼到MP3的URL,然後將MP3送達給他們(或分享鏈接到MP3文件)。 – h2ooooooo

+0

@ h2ooooooo mod_rewrite到一箇中央的PHP文件,它可以訪問磁盤上的其他數據? – bwoebi

回答

1

您可以通過創建一個htaccess的重寫用戶指PHP腳本做到這一點:

RewriteEngine On 
RewriteRule ^download/([^/]+) /lib/download.php?file=$1 [QSA] 

這將轉發任何​​請求yourdomain.com/download/anyfilehere.mp3?one_time_token=ABCDEFGlib/download.php並設置$_GET['file']anyfilehere.mp3one_time_token$_GET參數將被轉發,因爲我們使用[QSA]

download.php可以簡單地是這個樣子:

<?php 
    if (!empty($_GET['file'])) { 
     if (!empty($_GET['one_time_token'])) { 
      if (TokenOK($_GET['one_time_token'])) { //Create a function called TokenOK where you look up the download token in eg. a database 
       $fileName = '/var/www/downloadfolder/' . $_GET['file']; 
       if (file_exists($fileName)) { 
        ExpireToken($_GET['one_time_token']); //Create a function called ExpireToken where you expire the token in eg. the database 
        readfile($fileName); //Read the file to the user 
        die(); 
       } else { 
        die('Error: file not found'); 
       } 
      } else { 
       die('Error: token is not OK'); 
      } 
     } else { 
      die('Error: token is not specified'); 
     } 
    } else { 
     die('Error: file is not specified'); 
    } 
?> 

需要考慮的事情:

  • 輸出MIME頭類型指定內容類型文件的
  • this PHP manual entry on readfile
  • 將一次性令牌限制爲僅在證書中有效(並通知您的用戶),而不是隻允許它只下載一次
  • 如果用戶取消下載並因此無法再次下載它,系統會如何反應?
  • 如果下載失敗會怎麼樣?他們是否需要請求新的下載鏈接?
  • 如果它是一個流的MP3文件,確保工程求(它很可能不會,如果你尋求外部,其中MP3已經分流到,因爲它會創建一個MP3文件的新請求)
+0

如何實現令牌?有一個PHP特定的功能? – James

+1

@James生成隨機ID並將其放入數據庫(如果必須,請使用'uniqid'),然後將該ID發送給用戶並將其用於鏈接。你的數據庫應該是'id |令牌| ip |有效「或」id |「令牌| ip | valid_until'基於你使用哪種方法。 IP是可選的,但可能很好,所以你可以看到一個用戶是否下載了同樣的文件十億次。 – h2ooooooo

+0

非常感謝,愛你很多哈哈哈:) – James