2010-04-14 88 views
42

我用這來發送文件到用戶刪除用戶後,文件下載

header('Content-type: application/zip'); 
header('Content-Length: ' . filesize($file)); 
header('Content-Disposition: attachment; filename="file.zip"'); 
readfile($file); 

我想刪除用戶下載之後這個文件,我怎麼能做到這一點?

編輯:我的場景就是這樣,當用戶點擊下載按鈕時,我的腳本將創建一個臨時的zip文件,然後用戶下載它,然後該temp文件將被刪除。

EDIT2:確定最好的方法似乎運行一個小時將清理臨時文件的cron作業。

編輯3:我測試了我的腳本與unlink,它的工作原理,除非用戶取消下載。如果用戶取消下載,則zip文件保留在服務器上。所以現在已經足夠了。 :)

編輯4:哇! connection_aborted()取得了訣竅!

ignore_user_abort(true); 
if (connection_aborted()) { 
    unlink($f); 
} 

即使用戶取消下載,也會刪除該文件。

+0

可能重複[檢查是否下載完成(http://stackoverflow.com/questions/1563187/check-如果下載完成) – hakre 2013-03-13 12:53:17

回答

21
unlink($filename); 

這將刪除文件。

它需要與ignore_user_abort()Docs結合使用,即使用戶取消下載仍然執行unlink

ignore_user_abort(true); 

... 

unlink($f); 
+0

好吧,但它會工作,而用戶下載它? – 2010-04-14 23:11:09

+2

最好的辦法是不直接從磁盤提供文件,而是使用唯一的URL,在下載請求後可以禁用該URL。 – inkedmn 2010-04-14 23:13:05

+1

我的場景就是這樣,當用戶點擊下載按鈕時,我的腳本將創建一個臨時文件。 zip文件和用戶下載它,然後該臨時zip文件將被刪除 – 2010-04-14 23:16:38

8

沒有任何檢測文件是否完全由用戶下載的正確方法。
所以最好的辦法是在一段時間不活動後刪除文件。

+0

我認爲最好在設置Cron作業以在一段時間後刪除文件,比如在文件下載啓動後5分鐘。 (假設下載時間不超過5分鐘)。 – 2014-03-28 10:27:06

0

我能想到的最安全的方法是使用一些客戶端的Flash電影,可以觀察客戶端的傳輸,然後在下載完成後向服務器發出XmlHttpRequest調用。

AFAIK,有沒有辦法做到這一點可靠不使用Flash技術(或類似的瀏覽器插件)

2

我也有非常類似的功能在我的網站之一。這將像刪除/取消下載後刪除隨機創建的文件夾& zip文件。我試圖在這裏解釋它,可能會有人覺得它有用。

skin.php:
此頁面包含下載鏈接,如 「http://mysite.com/downoload/bluetheme」

的.htaccess:
我有以下htaccess的文件規則將下載請求重定向到一個php文件。 [的download.php]。

RewriteRule ^download/([A-Za-z0-9]+)$ download.php?file=$1 [L] 

的download.php:

include "class.snippets.php"; 
$sn=new snippets(); 
$theme=$_GET['file']; 
$file=$sn->create_zip($theme); 
$path="skins/tmp/$file/$file.zip"; 
$config_file="skins/tmp/$file/xconfig.php"; 
$dir="skins/tmp/$file"; 

$file.=".zip"; 
header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=$file"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile($path); 

//remove file after download 
unlink($path); 
unlink($config_file); 
rmdir($dir); 

等方面提出要求的download.php將使用片斷類隨機名稱創建目錄。在目錄內,它將創建一個zip文件。在下載/取消請求後,所有文件和目錄將被刪除。

1

我找不到一些東西,爲我工作,所以我想出了這個,這似乎也爲我工作:

header('Content-type: application/zip'); //this could be a different header 
header('Content-Disposition: attachment; filename="'.$zipName.'"'); 

ignore_user_abort(true); 

$context = stream_context_create(); 
$file = fopen($zipName, 'rb', FALSE, $context); 
while(!feof($file)) 
{ 
    echo stream_get_contents($file, 2014); 
} 
fclose($file); 
flush(); 
if (file_exists($zipName)) { 
    unlink($zipName); 
} 

我希望幫助別人

0

connection_aborted()從不爲我工作。 但ob_clean()完全按照它應該的方式工作。希望這幫助別人太

header('Content-type: application/pdf'); 
header('Content-Disposition: inline; filename="' . $file . '"'); 
header('Content-Transfer-Encoding: binary'); 
header('Accept-Ranges: bytes'); 
ob_clean(); 
flush(); 
if (readfile($file)) 
{ 
    unlink($file); 
} 
8

我總是採用如下方案:中

register_shutdown_function('unlink', $file); 
+0

適用於我在函數運行時需要存在文件的情況,但是一旦腳本全部完成,它就成功刪除臨時文件。 – Reisclef 2017-08-17 16:29:46

+0

以'ignore_user_abort(true)'表現最好;',imho應該被接受anwser – 2017-08-17 19:14:55

+0

這個解決方案解決了調用ob_end_flush()似乎結束腳本執行的問題(即使在下一行調用了unlink)。 – danielcraigie 2017-09-06 10:29:36

相關問題