ただ、ダウンロード直後にファイルを削除すると、ダウンロード前にファイルがなくなってしまうためか、Not Foundになってしまいます。
良い対策はございませんか?
csvファイルをPHPを経由してダウンロードさせるのはいかがでしょうか?
つまり、download.php(仮称)を作成し、
http://XXXX/download.php?file=sample.csv
などとしてアクセスさせます。
download.phpでは、fileパラメタで受け取ったファイル名からファイルを探し、存在すれば、それをCSVとしてのヘッダとともに返す。という感じです。
一度出力したファイルについては、データを返した後、または、バッファに読み込んだあとファイル自体を削除してしまえばよいかと思います。
きちんと排他制御も行えば、完全に1度しかダウンロードできない仕組みができると思います。
何かの参考になれば。
PHPでなくJava Servletで使った方法ですが参考までに。
同じ方法が適用できるかわかりません。
CSVやExcelファイルを生成しユーザにダウンロードさせるのにファイルをいったん吐き出すのではなくて、ServletOutputStreamを取得しそこにCSVを流し込んであげるという方法が使えました。
つまり、通常レスポンスとしてHTMLなどを返すところにCSVを動的に生成してあげればユーザから見たらダウンロードに見えるがサーバにはCSVの実体は残らないことになると思います。
http://www.ingrid.org/jajakarta/servletapi/servletapi-4.0/docs-j...
header('Location:test.csv')
はブラウザに対して、test.csvを読みに行くように指示をする処理となります。そのため、
1.ブラウザ → サーバ 「download.php?file=test.csvというデータをくれ」
2.サーバ → ブラウザ 「test.csvにデータがあるよ」
3.ブラウザ → サーバ 「test.csvというデータをくれ」
というやり取りになります。
1の処理の最後でtest.csvを削除してしまうと、3のアクセスの際にはファイルは存在しないので、FILE NOT FOUNDになります。
1.の処理の時点で、
/** ファイル名の取得 */ $filename = $_GET['file']; /** HTTPヘッダの出力 */ header("Content-disposition: attachment; filename=$filename"); header("Content-type: application/octet-stream; name=$filename"); /** ファイルデータの書き出し */ readfile($filename); /** ファイルの削除 */ unlink($filename);
などとしてあげてください。
ありがとうございました。
解決いたしました。
ファイルを作らずに直接出力するのはダメなんでしょうか。
3番の回答を借りると
/** HTTPヘッダの出力 */ header("Content-disposition: attachment; filename=$filename"); header("Content-type: application/octet-stream; name=$filename"); /** CSV データの書き出し */ echo $csvdata ;
みたいな感じで。
現状は、download.php?=test.csvのように渡し、header('Location:test.csv')のようにしておりますが、これとはまた別の方法でしょうか??