13

我正在使用 php 下载文件,我希望文件在成功完成下载后自动从服务器中删除。我在 php 中使用此代码。

$fullPath = 'folder_name/download.txt';

if ($fd = fopen ($fullPath, "r")) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);

    header("Content-type: application/octet-stream");
    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    header("Content-length: $fsize");
    header("Cache-control: private"); //use this to open files directly
    $fd = fopen ($fullPath, "r");
    while(!feof($fd)) {
        $buffer = fread($fd, 2048);
        echo $buffer;
    }
    fclose ($fd);

}

unlink($fullPath);

您可以在下载后的代码中看到我取消了文件链接。但如果我这样做,损坏的文件就会被下载。因为有时文件在完全下载之前就被删除了。无论如何在php中知道客户端成功下载文件然后我可以删除它?任何想法都将受到高度赞赏。

4

7 回答 7

6

据我所知,您不能使用服务器端 PHP 来检测客户端的下载是否已完成。这似乎ignore_user_abort()是您问题的答案(见下文),否则您可能会在一段时间后删除该文件。

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

Stackoverflow上的相关/重复:

于 2013-06-26T12:29:33.733 回答
2

如果您真的在下载(而不是像您帖子中的代码所建议的那样上传),您可能会对专门设计用于创建文件的tmpfile函数感兴趣,该函数将在其描述符关闭时立即被删除。

于 2013-06-26T13:08:28.420 回答
1

无法知道用户何时使用 PHP 完成文件下载,我会在请求的 n 秒后使用队列系统删除文件:

如何构建 PHP 队列系统

于 2013-06-26T14:21:28.497 回答
1

检查服务器和客户端上文件的哈希码...您可以使用 javascript(如何使用 javascript 计算文件的 md5 哈希)检查哈希码将其发送到服务器,然后检查它是否是服务器上也一样...

于 2013-06-26T12:19:53.367 回答
0

检查请求,如果设置了 Range HTTP 头,则客户端正在分段下载文件,它只想一次下载一小部分数据(例如:Range: bytes=500-999)。通常这是由网络服务器自动处理的,但在这种情况下,您必须处理它并仅将请求的范围发送回来。仅当客户端下载了所有片段时,才将进度存储在会话中并拒绝访问。

于 2013-06-26T12:32:07.647 回答
0

这对于大文件可能有点问题,但在快速连接上的小文件我使用它没有问题。

<?php
 ### Check the CREATE FILE has been set and the file exists
if(isset($_POST['create_file']) && file_exists($file_name)):
### Download Speed (in KB)
$dls = 50;
### Delay time (in seconds) added to download time 
$delay = 5; 
## calculates estimated download time
$timer = round(filesize($file_name) / 1024 / $dls + $delay); 
###Calculates file size in kb divides by download speed + 5 ?>

<iframe width="0" height="0" frameborder="0" src="<?php echo $file_name;?>"></iframe>
<h2>Please Wait, Your Download will complete in: <span id="logout-timer"></span></h2> 

使用文件值 ?f=$file_name 重定向到 SELF

<script>setTimeout(function(){ window.location = "<?php echo $_SERVER['PHP_SELF']?>?f=<?php echo $file_name;?>";},<?php echo $timer;?>000);</script>

删除文件

     <?php 
 endif;
if (isset($_GET['f'])):
    unlink($_GET['f']);
    ### removes GET value and returns to page's original url
    echo "<script> location.replace('".$_SERVER['PHP_SELF']."')</script>"; 
    endif;?>

以 var 秒为单位为每个文件设置下载计时器

<script>
var seconds=<?php echo $timer;?>;function secondPassed(){var a=Math.round((seconds-30)/60);var b=seconds%60;if(b<10){b="0"+b}document.getElementById('logout-timer').innerHTML=a+":"+b;if(seconds==0){clearInterval(countdownTimer);document.getElementById('logout-timer').innerHTML="Timer"}else{seconds--}}var countdownTimer=setInterval('secondPassed()',1000);
</script>
于 2014-03-08T00:52:39.003 回答
-1

不确定它是否适用于几乎所有情况,但请尝试 sleep(10); 某些特定时间延迟文件删除的东西。

于 2013-06-29T15:49:41.887 回答