プロが教えるわが家の防犯対策術!

phpでzipファイルダウンロード後の削除について

phpにおいて、ボタンをクリックしたときに、サーバ内の
ディレクトリの中身をzip圧縮してダウンロードを行う処理を
作成し、ダウンロード後はサーバ内のzipファイルを
削除したいと考え、下記のような流れでプログラムを作成しました。

//1.zipファイルの作成
shell_exec("zip -r file.zip targetdir");

//2.HTMLヘッダ
Content-type ・・・

//3.readfileでファイル読み込み
readfile(file.zip);

//4.ファイル削除
shell_exec("rm -f file.zip");

3.までは上手く動作して、意図したzipファイルを
ダウンロードできるのですが、
4.の動作が、3.でのダウンロードダイアログで
・「保存」してダウンロードすると動作して削除する。
・「キャンセル」してダウンロードせずダイアログを
閉じると削除されずサーバに残ってしまう。

となってしまいます。
ちなみに一旦「保存」を選択して、ダウンロード途中に
「キャンセル」を選択して中断しても削除されませんでした。

ダウンロードダイアログでの操作に関わらず作成した
zipファイルを削除したいのですが、どのようにすればいいか
わかりません。
shell_exec関数をunlinkなどに変えて見ても結果は同じでした。

アドバイスを頂ければと思い質問させていただきました。
よろしくお願いします。

A 回答 (3件)

ダウンロードダイアログはローカルでのお話しなので、きちんと完了したかどうか直接PHP側で感知することは不可能でしょう。


やるなら JavaScriptの window.onunload あたりを使用して当該ページから離れたタイミングで Ajaxで感知して削除するしかないかと。
あるいは気持ち悪いのに耐えられるなら、zipファイルの作成時点で一定時間を過ぎた過去分を削除するしかないと思いますよ。
Ajaxでの結果は信用できないので、現実的には両方併用でしょうかね。

また、余計なお世話かもしれませんが、バックアップ等で管理者だけが使用するならかまいませんが、もし不特定多数が使用する場合、ファイル名も考慮しないと、だれかさんの途中で削除してしまうかも。
    • good
    • 0

#Ano1追記


あ。バッファを使う手があるかも。しばらく締め切らずによい回答をお待ち下さい。
    • good
    • 0

いけますね。

readfileではなく、freadで一旦変数に格納してファイル本体はすぐに削除。
それから出力すれば、ダウンロード完了でもキャンセルでも、ファイルは削除されていることになります。(ファイルサイズがあまりに大きすぎると厳しいかもしれませんが)

万一不明なときは補足してください。

この回答への補足

アドバイスありがとうございます。

自宅では環境がありませんので、
月曜日に教えて頂いた方法を試してみようと思います。

ただファイルサイズが250Mぐらいまで対応する必要がありますので
処理時間やスペックの問題が発生するかもしれません。
試した結果についても報告させて頂きます。

また、質問に書き損ねていたのですが、readfileを用いたとき
ファイルサイズが1Kぐらいのテキストファイルで試すと
ダウンロードダイアログでの操作に関わらず削除することが
できます。
ファイルサイズが大きいとなにかとややこしそうですね・・・

補足日時:2010/07/04 11:10
    • good
    • 0
この回答へのお礼

お礼遅くなってしまい申し訳ありません。

教えていただいた方法はやはり大きいファイルのときには
厳しいようで、結局作業後削除するのを諦め、作業前にファイル
があるときには削除するという処理を記述することにしました。
作業後次の作業までサーバにファイルが残るのが少し気持ち悪い
のですが、HDDには余裕がありますのでこのようにしました。

貴重なアドバイスありがとうございました。

お礼日時:2010/08/01 21:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!