0

ユーザーがダウンロードする必要がある zip ファイルを動的に作成しています。ダウンロードが完了したら、ファイルを削除したいと思います。すべての JS の方法は安全ではないと思います。したがって、php がサーバー側の言語であることは秘密ではありません。これにより、クライアントとサーバーの間でバイトが送信されなくなったため、何らかの方法でダウンロードが完了したことがわかります。私が上で説明したことを達成する同様の方法はありますか?

4

3 に答える 3

2

私の知る限り、ユーザーがいつダウンロードを終了したかを知る方法はありません。

ファイルを別のキューに保存し、一定の時間 (1 時間から 1 日の間) が経過したら削除します。

于 2012-08-14T11:53:44.420 に答える
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

注意: 私のテストでは、削除していませんでした。代わりに、「ダウンロード完了」として syslog に出力を与えてから、syslog を監視してスクリプトを実行しました。

ダウンロードが〜1900KB / 2000KBのようにダウンロードが完了したと言っていましたが、おそらくクロムの問題ですが、sleep(3)を使用できます。ファイルを削除する前に3秒間待って、問題がないことを確認してください。

編集: このスクリプトは、ダウンロードが何らかの理由で失敗した場合でもファイルを削除します。ダウンロードを試みるたびにファイルを作成する必要がある場合があります。私は一緒に行きます:

1- ファイルの作成 2- ユーザーのダウンロード/失敗 3- ファイルの削除 4- ユーザーが再度ダウンロードしたい場合: 1 に進む

于 2012-08-14T12:19:34.810 に答える
0

PHP でダウンロードを処理している場合は、ignore_user_abort() を使用して、接続が切断された場合にスクリプトを実行し続け、データをチャンクで送信するときに connection_aborted() を確認できます。すべてのチャンクが設定される前に中止が発生した場合、ダウンロードは失敗しました。Web サーバーは PHP 出力をバッファリングするため、転送が本当に最後に達したという保証はありません。

これを行う別の可能な方法は、PHP スクリプトにイベント通知を送信するパイプされた Apache ログをセットアップすることです。これは、ダウンロードが PHP 自体によって処理されない場合でも機能します。サーバーが最後のパケットが安全に到着したという TCP/IP 確認応答を受信しない限り、Apache はリクエストが HTTP 200 で完了したというフラグを立てないと思います。

于 2012-08-14T12:16:01.243 に答える