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

このQ&Aのポイント
  • phpにおいて、ボタンをクリックしたときに、サーバ内のディレクトリの中身をzip圧縮してダウンロードを行う処理を作成し、ダウンロード後はサーバ内のzipファイルを削除したいと考え、方法を探しています。
  • ダウンロードダイアログでの操作に関わらず作成したzipファイルを削除する方法をお知りの方がいらっしゃいましたら、アドバイスを頂きたいです。
  • shell_exec関数をunlinkなどに変えても結果は同じでした。どのようにすればzipファイルを削除することができるでしょうか。
回答を見る
  • ベストアンサー

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

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などに変えて見ても結果は同じでした。 アドバイスを頂ければと思い質問させていただきました。 よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

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

orionecho
質問者

お礼

お礼遅くなってしまい申し訳ありません。 教えていただいた方法はやはり大きいファイルのときには 厳しいようで、結局作業後削除するのを諦め、作業前にファイル があるときには削除するという処理を記述することにしました。 作業後次の作業までサーバにファイルが残るのが少し気持ち悪い のですが、HDDには余裕がありますのでこのようにしました。 貴重なアドバイスありがとうございました。

orionecho
質問者

補足

アドバイスありがとうございます。 自宅では環境がありませんので、 月曜日に教えて頂いた方法を試してみようと思います。 ただファイルサイズが250Mぐらいまで対応する必要がありますので 処理時間やスペックの問題が発生するかもしれません。 試した結果についても報告させて頂きます。 また、質問に書き損ねていたのですが、readfileを用いたとき ファイルサイズが1Kぐらいのテキストファイルで試すと ダウンロードダイアログでの操作に関わらず削除することが できます。 ファイルサイズが大きいとなにかとややこしそうですね・・・

その他の回答 (2)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

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

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.1

ダウンロードダイアログはローカルでのお話しなので、きちんと完了したかどうか直接PHP側で感知することは不可能でしょう。 やるなら JavaScriptの window.onunload あたりを使用して当該ページから離れたタイミングで Ajaxで感知して削除するしかないかと。 あるいは気持ち悪いのに耐えられるなら、zipファイルの作成時点で一定時間を過ぎた過去分を削除するしかないと思いますよ。 Ajaxでの結果は信用できないので、現実的には両方併用でしょうかね。 また、余計なお世話かもしれませんが、バックアップ等で管理者だけが使用するならかまいませんが、もし不特定多数が使用する場合、ファイル名も考慮しないと、だれかさんの途中で削除してしまうかも。

関連するQ&A

  • ダウンロード後 zipファイル削除

    アクセスログをZIPファイルにしてダウンロードした後ファイルが自動的に削除されるようにしようと思っていますが、失敗続きです。 今までの軌跡、 1、ZIPファイルをArchive::Zipで作成、print "Location×××.zip:\n\n";でダウンロード後、当該ZIPファイルをunlink 結果、失敗 404エラーになる 2、ZIPファイルをArchive::Zipで作成、print "Location×××.zip:\n\n";でダウンロード後、当該ZIPファイルをENDサブルーチンでunlink 結果、失敗 404エラーになる 3、File::TempをZIPに利用できないか試みるがArchive::Zipはファイルハンドルを使わないため利用できないのではと断念。 とまあこんな感じで現在に至っています。 なぜ削除しなければならないのかというと外部からアクセスされるとアクセスログがダウンロードできるとこまるからです。なのでダウンロード後すぐに削除、できればダウンロード後すぐ削除されれば理想と思っています。 3、に関してですが、ならばZIPにしないでテキストでダウンロードさせればいいじゃんと思うかもしれませんが、色々なファイルをまとめてダウンロードさせたいと思っているので、それはできない状況。 手段を知っている方助けてください。

    • ベストアンサー
    • Perl
  • PHP zipファイルのダウンロード

    下記のようなPHPスクリプトにおいて、zip フォルダに画像ファイルの圧縮ファイルを 保存し、ダウンロードしたいんです。ダウンロードの動作はChrome上で確認できてますが、圧縮した、ダウンロードファイルのサイズが0KB で、空なのです。 どこが間違っているか教えていただけますか? [file_zip.php] <?php mb_internal_encoding("UTF-8"); $ftp = ftp_connect("~"); ftp_login($ftp, "~", "~"); $dir = '/storage2/zip'; ftp_chdir($ftp, $dir); // ディレクトリ移動 // Zipクラスロード $zip = new ZipArchive(); // Zipファイル名 $zipFileName = $_POST['zip_filename']; var_dump($zipFileName); // Zipファイル一時保存ディレクトリ $zipTmpDir = '/storage2/zip'; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 echo '圧縮ファイルをオープンできませんでした'; exit(); } // ここでDB等から画像イメージ配列を取ってくる $image_data_array = array(); array_unshift($image_data_array, $zipTmpDir.$zipFileName); // 処理制限時間を外す set_time_limit(0); foreach ($image_data_array as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく unlink($zipTmpDir.$zipFileName); // header("Location: storage.php"); ?>

    • 締切済み
    • PHP
  • PHPでのファイルのダウンロードについて

    お世話になります。 タイトルのとおりPHPでファイルのダウンロードを行いたいのですが、 ファイルを保存するというダイアログが出てくれません。 tesuto.php <?php $file="/work/tesuto.csv"; header ("Content-Disposition: attachment; filename=$file"); header ("Content-type: application/x-csv"); readfile ($file); ?> tesuto.phpを実行するとダウンロードされずに、ファイルの中身が表示されてしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • zipファイルのダウンロードについて

    RapidshareなどからFlashGetなどでzipファイルをダウンロードするとzipファイルではなく、phpファイルが ダウンロードされます。なぜzipファイルが落とせないのでしょうか?

  • PHPで自動的にzipファイルをダウンロードする。

    質問させてもらいます。 現在外部ドメインに用意されているzipファイルを手動でダウンロードして、FTPで特定フォルダにアップしてから、PHPで処理を行っているのですが、 外部ドメインのzipファイルを、PHPでダウンロード(コピー)する事は不可能なのでしょうか? ちなみに、色々検索をしてみたのですが、見当たりません・・・。 また、copy()関数でzipファイルをコピーしてみたのですが、ファイルが壊れていて解凍できませんでした。 他に方法があれば、試してみたいので、宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPでファイルのダウンロード判定について

    PHPでファイルのダウンロード判定について 宜しくお願い致します。 PHPのheaderでCSVファイルをダウンロードさせる際に、ダウンロードダイアログの開く、保存、キャンセルのどのボタンを押したかを取得する事はできますか? 開いた場合と保存した場合とキャンセルした場合で、その後の処理を変えたいと考えております。

    • ベストアンサー
    • PHP
  • PHPで複数ファイルをZIPで圧縮してダウンロードさせる処理を作りまし

    PHPで複数ファイルをZIPで圧縮してダウンロードさせる処理を作りました。 色々とテストしてみると、ダウンロードして解凍しようとすると「未知の形式」となり解凍できない場合があります。 ファイル数の問題かと思いサイズが小さいファイルを5つ圧縮してダウンロードしてみると正常に解凍できました。 サイズが大きいファイルを4つ圧縮してダウンロードしてみると「未知の形式」になることがわかりました。 何かサーバー側で制限をかけているのでしょうか? サーバーはApache2.2をローカルで使用しています。「zip.lib.php」を使用してプログラムを書きました。 ソースは以下のサイトのものをそのままコピーしました。 http://www.confrage.com/php/forward/download_comp/download_comp.html#list2

    • ベストアンサー
    • PHP
  • PHPでファイルのダウンロードについて

    お世話になります。ダウンロードボタンを付けてファイルのダウンロードを行う処理で困った事になってます。 (DL.php) $file_name=htmlspecialchars(@$_POST['file_name']); $file_name=addslashes($file_name); mb_convert_variables("SJIS-WIN","EUC-JP",$file_name); $file_to=htmlspecialchars(@$_POST['file_to']); $file_to=addslashes(@$_POST['file_to']); header ("Content-Disposition: attachment; filename=".$file_name); header ("Content-type: application/octet-stream"); require_once("dl_config.php"); readfile ($data_pas.$file_to); dl_config.php <?PHP $data_pas="/data/"; ?> この状態でテキストファイルをダウンロードすると、DLしたファイルの中に不要な改行ファイルが挿入されています。 またrequire_once("dl_config.php");を削除し readfile ($data_pas.$file_to);を readfile ("/data/".$file_to);とすると、改行は入らなくて、正常なファイルがダウンロードされます。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHP 削除やコピーが出来ない

    PHP 削除やコピーが出来ない $rcd = unlink("test.txt"); $rcd = `rm test.txt`; $rcd = exec('test.txt'); 上記のように、削除コマンドを実行しても削除されない。 コピーコマンドも、同じくで copy("hoge.txt", "hoge.dat"); fcopy("hoge.txt", "hoge.dat", TRUE); `cp hoge.txt hoge.dat` と、やってみたが削除対象ファイルなどに変化はありません。 ちなみに、削除対象ファイルのパーミッションは、644。 PHPファイルは、755. レンタルサーバーを、二つほど変えてみたが同じでした。 エラーを表示することも無かったので、何が悪いのかさっぱり分かりません。 何か、よい方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • zipのファイルのダウンロードが始まらない

    zip形式のファイルをダウンロードしようとしたらサーバーが見つからないか、DNS エラーですが出てきてしまいます。コントロールパネルのフォルダオプションをいじったりとかいろいろやってみたのですがわかりません…OSはXPです。zip解凍ソフトとかは一通りダウンロードしてあると思います。よろしくお願いします…