ユーザーがダウンロードする必要がある zip ファイルを動的に作成しています。ダウンロードが完了したら、ファイルを削除したいと思います。すべての JS の方法は安全ではないと思います。したがって、php がサーバー側の言語であることは秘密ではありません。これにより、クライアントとサーバーの間でバイトが送信されなくなったため、何らかの方法でダウンロードが完了したことがわかります。私が上で説明したことを達成する同様の方法はありますか?
3 に答える
私の知る限り、ユーザーがいつダウンロードを終了したかを知る方法はありません。
ファイルを別のキューに保存し、一定の時間 (1 時間から 1 日の間) が経過したら削除します。
ダウンロードを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
注意: 私のテストでは、削除していませんでした。代わりに、「ダウンロード完了」として syslog に出力を与えてから、syslog を監視してスクリプトを実行しました。
ダウンロードが〜1900KB / 2000KBのようにダウンロードが完了したと言っていましたが、おそらくクロムの問題ですが、sleep(3)を使用できます。ファイルを削除する前に3秒間待って、問題がないことを確認してください。
編集: このスクリプトは、ダウンロードが何らかの理由で失敗した場合でもファイルを削除します。ダウンロードを試みるたびにファイルを作成する必要がある場合があります。私は一緒に行きます:
1- ファイルの作成 2- ユーザーのダウンロード/失敗 3- ファイルの削除 4- ユーザーが再度ダウンロードしたい場合: 1 に進む
PHP でダウンロードを処理している場合は、ignore_user_abort() を使用して、接続が切断された場合にスクリプトを実行し続け、データをチャンクで送信するときに connection_aborted() を確認できます。すべてのチャンクが設定される前に中止が発生した場合、ダウンロードは失敗しました。Web サーバーは PHP 出力をバッファリングするため、転送が本当に最後に達したという保証はありません。
これを行う別の可能な方法は、PHP スクリプトにイベント通知を送信するパイプされた Apache ログをセットアップすることです。これは、ダウンロードが PHP 自体によって処理されない場合でも機能します。サーバーが最後のパケットが安全に到着したという TCP/IP 確認応答を受信しない限り、Apache はリクエストが HTTP 200 で完了したというフラグを立てないと思います。