2012-08-14 110 views
0

我正在動態創建zip文件,用戶應該下載,下載完成後我想刪除文件。我認爲所有JS方法都不安全。所以不是一個祕密,它是一個服務器端語言,這使得我認爲在某種程度上必須離開那個客戶端和我的服務器字節之間不再傳輸,所以我可以告訴現在下載完成。有沒有類似的方式來完成我上面描述的?PHP文件下載完成事件

+0

可能重複的http://計算器。 com/questions/4905664/detect-if-download-is-complete,http://stackoverflow.com/questions/1563187/check-if-download-is-completed – Adi 2012-08-14 11:57:24

+0

已經回答: http:// stackoverflow.com/questions/1106377/detect-when-browser-receives-file-download – thedethfox 2012-08-14 11:58:37

+0

http://stackoverflow.com/questions/1563187/check-if-download-is-completed – 2012-08-14 12:03:40

回答

2

據我所知,沒有辦法知道用戶何時完成下載。

我將文件存儲在單獨的隊列中刪除它們經過一定的時間已經過去(1H和1D之間的事情)

+0

如果一個壞傢伙做同樣的事情和服務器滿員服務器的內存呢? – user1485518 2012-08-15 09:14:58

+0

即使您在用戶完成下載時刪除文件,您也有同樣的問題。 i.E.壞人模擬一個緩慢的連接或禁用響應,告訴你關於完成的下載。 如果您害怕有人濫用系統,您應該考慮採用其他方式分發下載文件(也許可以將每封電子郵件的鏈接發送給註冊用戶,然後每小時只發送幾個文件) – wodka 2012-08-15 14:45:35

0

如果你正在處理下載在PHP中,你可以使用ignore_user_abort()來在連接斷開的情況下讓腳本繼續運行,並在發送數據塊時檢查connection_aborted()。如果在所有塊被設置之前發生中止,則下載失敗。由於Web服務器緩衝PHP輸出,因此不能保證傳輸真的已經結束。

另一種可能的方法是設置一個管道Apache日誌,將事件通知發送到PHP腳本。即使下載不能被PHP本身處理,這也可以工作。我相信Apache不會將該請求標記爲使用HTTP 200完成,除非服務器收到最後一個數據包安全到達的TCP/IP確認。

0

爲什麼不讓PHP來處理下載?

//you may need setting php runtime limit to zero. 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 

$filename = "myfile.zip"; 
$file = file_get_contents($filename); 
echo $file; 

//download complete 
unlink($filename); //delete file 

注意: 在我的測試中,我並沒有刪除,而不是我給輸出到系統日誌爲「下載完成」 然後查看系統日誌和運行腳本,

有人說下載完成下載似乎〜1900KB/2000KB 它可能是一個鉻合金問題,但你可以使用睡眠(3);並在刪除文件前等待3秒鐘以確保沒有問題。

編輯: 即使下載因任何原因失敗,該腳本也會刪除文件。您可能需要爲每次下載嘗試創建文件。 我會去的:

1-創建文件 2-用戶下載/失敗 3-刪除文件 4-如果用戶想再次下載:去1

+0

如果文件很大,你不知道要等多久? – user1485518 2012-08-15 09:13:53