2016-07-25 44 views
2

我有一個PHP文件,其中有一個按鈕,我想下載一個文件的幫助,我想嘗試使用AJAX調用PHP,(因爲,我覺得它更安全),目前,我有以下代碼...如何知道用戶是否已下載文件

<a onclick="download_file (<?= $row["id"]?>)">Download</a> 

然後download_file的功能如下:

function download_file (fileid) 
{ 
    $.ajax 
    ({ 
    type: "POST", 
    url: 'download.php', 
    data: {id: fileid}, 
    success: function(data) 
    { 
    window.location = 'download.php?link='+data; 
    } 
    }); 
} 

現在這是什麼一樣的是,它首先調用download.phpPOST請求(以保持位置更安全一點)fileid,以便腳本從數據庫中提取文件的位置並將其作爲data變量返回給AJAX腳本。

現在什麼接下來的是,在成功的功能,download.php再次調用,但這次有了GET請求,然後將文件進行搜索,改名(如服務器,他們有隨機的文件名),然後下載...造成這種情況的PHP代碼:

header("Cache-Control: private"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=".$file.""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: binary/octet-stream"); 
readfile ($link); 

現在,一切都完美的作品,我擔心的是安全,我想使文件更加安全,我想會產生類似的隨機和獨特的下載鏈接,後下載已經完成,鏈接被關閉,但文件保持不變...我想過一種方法來創建一個臨時文件與另一個地址,並使用cron作業刪除臨時文件,但是這給了cron作業的特定時間間隔一段時間的窗口,下載鏈接將是靜態的,這對於站點是不利的......我希望單個鏈接對於單個下載應該是有效的(但鏈接應該在整個下載,即RESUME應該支持)。

或者如果可能的話,我是否也可以使用身份驗證,例如用戶已登錄,下載鏈接將處於活動狀態,但只要用戶退出應用程序並打開下載鏈接,它應該提示用戶登錄任一或顯示404錯誤...

而且我也想的是如何通過任何其他方法來提高相同的安全建議...

回答

2

您將需要創建一個代理這將在您的download.php被調用之前調用。基本上你的代理將做以下事情:

  1. 根據您的會話驗證用戶。
  2. 生成一個UNIQUE下載鏈接。爲此,您必須保持用戶和新生成的鏈接之間的某種映射。
  3. 傳遞這個新生成的鏈接,該鏈接將作爲參數傳遞給您的success回調函數。
  4. AJAX調用download.php鏈接將開始下載文件。您應該再次在download.php上使用您在用戶和數據庫或其他地方的下載鏈接之間創建的映射重新驗證使用情況。我寧願使用數據庫,因爲你將不得不維護一些下載歷史。
  5. 下載完成後,如果用戶再次嘗試點擊此URL,請將此映射標記爲「無效」並將其重定向到某種404頁面或其他內容。

希望這有助於!

+0

但是我怎麼知道用戶已經完成了下載? –

+0

我不認爲有辦法解決這個問題,因爲下載過程完全在客戶端/瀏覽器上處理。最接近你可以做的是假定用戶已經下載了文件,如果他/她已經開始下載過程。 – pioneer

+0

但是後來我的文件大小隻有10 MB,如果用戶的Internet速度真的很糟糕,就像Kb/s一樣,那麼下載將會失敗,因爲鏈接將被刪除,完成...所以,根本沒有轉移...... –

相關問題