- ベストアンサー
ダウンロード後 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にしないでテキストでダウンロードさせればいいじゃんと思うかもしれませんが、色々なファイルをまとめてダウンロードさせたいと思っているので、それはできない状況。 手段を知っている方助けてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイルのダウンロードをさせならが、ファイル名を宣言すればOKです。 print qq|Content-Type: application/octet-stream\n|; print qq|Content-Type: application/download; name="$filename"\n|; # $filename=target.zip print qq|Content-Disposition: attachment; filename="$filename"\n|; # print qq|Content-Length: $filesize\n|; # 設定すればダウンロード時間が表示されます print qq|\n|;
その他の回答 (2)
- atom_seed
- ベストアンサー率48% (25/52)
No.1を踏まえてperlで書き直してみました。 #!/usr/bin/perl print "Content-type: application/zip\n\n"; open( FH, "生成したzipファイル" ); binmode FH; binmode STDOUT; print <FH>; close( FH ); unlink 生成したzipファイル;
お礼
atom_seed様ありがとうございます。 ZIPファイルをビンモードで開いて標準出力へぶっこみその後削除というのは、PERLでもできたのですね。動きは理想どおりになったのですが、拡張子がスクリプト自身の拡張子になっちゃいました。 -----test.cgiで実行---- print "Content-type: application/zip\n\n"; open( FH, "target.zip" ) || die; binmode FH; binmode STDOUT; print <FH>; close( FH ); 結果 target.zipというファイル名ではなくtest.cgiというファイル名でダウンロード。ダウンロード自体は成功しているのですが、test.cgiを手作業でtarget.zipにかえないとだめみたいです。 グーグル様でもファイル名の解決法が見当たりません。
- chie65536
- ベストアンサー率41% (2512/6032)
print "Location ほげほげ.zip"では駄目。 WEBサーバーは、zipファイルをunlinkしたあと、ブラウザに Location ほげほげ.zip を送出する。 すると、ブラウザは「消された後に、ほげほげ.zipをWEBサーバーに要求する」ことになる、これでは404エラーが出て当たり前。 cgiを、以下のように組もう。 #!/usr/bin/csh echo "Content-type: application/zip\n\n" zipファイル生成 cat 生成したzipファイル unlink 生成したzipファイル これだと、catし終ったzipファイルは「標準出力に送出済み」なので消えても構わない。 「標準出力に送出済み」とは「WEBサーバーがブラウザに対して送出済み」と同義。 何が何だか判らないと思うけど、以下のcgiを動かせば理解出来ると思う #!/usr/bin/csh echo "Content-type: image/jpeg\n\n" cat サーバー上にある適当なjpeg画像ファイル
お礼
>WEBサーバーは、zipファイルをunlinkしたあと、ブラウザに >Location ほげほげ.zip >を送出する。 スクリプトの順番どおり行われるわけではないのですか。勉強になりました。 >何が何だか判らないと思うけど、以下のcgiを動かせば理解出来ると思う んん、と戸惑いました。読んだ後グーグル様で勉強しました。 >#!/usr/bin/csh シェルですね。WINDOWSで使っているためシェルが使えません。最初に書いておくべきでした。申し訳です。 PERLオンリーで何か方法がないでしょうか。ぜひできてほしいと願っています。 chie65536様回答ありがとうございました。
お礼
print qq||; この書き方初めてみました。自分はPERLをつまみつまんで独学で学んでおるので、どこからこういう知識を仕入れてくるのかいつも感服するばかりです。 動作を確認しました。ばっちりチリ足と思ったのですが、 ---警告: ZIP書庫の先頭に余分なデータが存在します--- と出てしまいました。これもグーグルで調べたのですがなんかウイルスと間違われてしまう恐れがあるみたいで、ここまできて・・・。と思ったのですが、 色々原因を調べてったら、最後の print qq|\n|; をとったら警告がとれました。めでたし。解決。やった。 atom_seed様ご助言ありがとうございました。ストレスが解消しました。