PHPでCSVをサーバー上に作成し、セキュリティの関係上、ユーザーにダウンロードさせた後に、ファイルを削除したいと思っております。


ただ、ダウンロード直後にファイルを削除すると、ダウンロード前にファイルがなくなってしまうためか、Not Foundになってしまいます。
良い対策はございませんか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/12/06 02:00:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント23pt

csvファイルをPHPを経由してダウンロードさせるのはいかがでしょうか?

つまり、download.php(仮称)を作成し、

http://XXXX/download.php?file=sample.csv

などとしてアクセスさせます。


download.phpでは、fileパラメタで受け取ったファイル名からファイルを探し、存在すれば、それをCSVとしてのヘッダとともに返す。という感じです。

一度出力したファイルについては、データを返した後、または、バッファに読み込んだあとファイル自体を削除してしまえばよいかと思います。


きちんと排他制御も行えば、完全に1度しかダウンロードできない仕組みができると思います。

何かの参考になれば。

id:makocan

現状は、download.php?=test.csvのように渡し、header('Location:test.csv')のようにしておりますが、これとはまた別の方法でしょうか??

2007/12/05 17:16:16
id:tomo_k No.2

回答回数426ベストアンサー獲得回数26

ポイント23pt

PHPでなくJava Servletで使った方法ですが参考までに。

同じ方法が適用できるかわかりません。

CSVやExcelファイルを生成しユーザにダウンロードさせるのにファイルをいったん吐き出すのではなくて、ServletOutputStreamを取得しそこにCSVを流し込んであげるという方法が使えました。

つまり、通常レスポンスとしてHTMLなどを返すところにCSVを動的に生成してあげればユーザから見たらダウンロードに見えるがサーバにはCSVの実体は残らないことになると思います。

http://www.ingrid.org/jajakarta/servletapi/servletapi-4.0/docs-j...

id:t_shiono No.3

回答回数256ベストアンサー獲得回数22

ポイント22pt
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);

などとしてあげてください。

http://dummy

id:makocan

ありがとうございました。

解決いたしました。

2007/12/05 23:57:05
id:GoldenDawn No.4

回答回数426ベストアンサー獲得回数81

ポイント22pt

ファイルを作らずに直接出力するのはダメなんでしょうか。

3番の回答を借りると

/** HTTPヘッダの出力 */
header("Content-disposition: attachment; filename=$filename");
header("Content-type: application/octet-stream; name=$filename");

/** CSV データの書き出し */
echo $csvdata ;

みたいな感じで。


http://q.hatena.ne.jp

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません