2010-02-24 198 views
6

我有一個文件託管網站和用戶獲得下載獎勵。所以我想知道有沒有一種方法可以跟蹤訪問者是否下載了整個文件,以便沒有假的部分下載僅用於獎勵。跟蹤文件完整下載

謝謝。

+0

假設這些文件很大? KB? MB? <100 Mb? – Strae 2010-02-25 07:47:23

+0

DK-Wamp說:「我可以有關於這個主題的其他細節嗎?」/ 我試圖使用這個腳本,但沒有爲我工作:(// 我知道這是一個老話題,但我希望找到一個解決方案。」 – Veedrac 2014-06-09 23:43:46

回答

1

如果你可以監視您的Web服務器返回的HTTP響應代碼,並配合他們回生成它們的會議,你會在企業。

206的響應代碼表明,該系統已交付了一些信息,但不是全部。當文件的最後一部分熄滅時,它不應該具有206的響應代碼。

如果您可以通過將會話代碼放入URL中將其綁定到用戶會話,那麼您可以基於簡單日誌聚合。

+0

你能告訴我一些它的用法的例子嗎? – Shishant 2010-02-25 12:18:41

+0

我沒有任何Apache日誌得心應手。你是否碰巧有一段文件從你的日誌中傳輸過來,你可以發佈?通過一個文件和一個IP地址過濾它以獲取相關條目。根據您的日誌格式,應該比較容易找到文件最後一頁的條目。 – TheJacobTaylor 2010-02-25 19:09:38

1

我實現了一個檔案託管網站上類似的解決方案。

你想要做的是使用register_shutdown_function回調,使您可以檢測一個PHP腳本的執行結束不分勝負。

然後,您希望將文件放在服務器上的非Web訪問位置,並通過php進行下載:想知道您希望能夠跟蹤已傳遞的字節數客戶端。

這裏實現的基本途徑(如:)

<?php 
register_shutdown_function('shutdown', $args); 

$file_name = 'file.ext'; 
$path_to_file = '/path/to/file'; 
$stat = @stat($path_to_file); 

//Set headers 
header('Content-Type: application/octet-stream'); 
header('Content-Length: '.$stat['size']); 
header('Connection: close'); 
header('Content-disposition: attachment; filename='.$file_name); 

//Get pointer to file 
$fp = fopen('/path/to/file', 'rb'); 
fpassthru($fp); 

function shutdown() { 
    $status = connection_status(); 

    //A connection status of 0 indicates no premature end of script 
    if($status == 0){ 
    //Do whatever to increment the counter for the file. 
    } 
} 
>? 

有明顯改善的方式,因此,如果您需要了解更多信息或其他行爲,請讓我知道!

+1

這會殺死大文件阿帕奇... – Strae 2010-02-25 07:47:49

+0

是的,你是對的,但它極大地在網站上的使用依賴。在我們的應用中,我們通過PHP來管所有的文件下載,因爲我們以前也驗證用戶和節氣門帶寬。點是,我們已經爲服務這些文件,將關閉後端存儲服務器上運行lighttpd的專用服務器。 我們已經通過定製編譯降低Apache的足跡和禁用所有,但必要的模塊。我們能夠處理大約35個前端同時下載/服務器約130個,總吞吐量爲2 .3Gbps ... – 2010-02-25 16:58:08