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 に答える
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 に答える