(PHP, JavaScript)フォーム送信されたファイルを加工後にダウンロードさせる処理
【参考】
ダウンロード後のファイルを削除したい - PHPプロ!Q&A掲示板
http://www.phppro.jp/qa/1339
下記の一連の処理を、cronなど面倒な処理を使わず、
なるべく簡単に、そしてユーザに親切な処理を作ることを目指します。
- ユーザがファイルをフォーム送信する。
- PHPでファイルを加工する。
- ユーザにダウンロードさせる。
- サーバ側に残っているファイルを削除する。
PHPファイルを3つ使います。
まずはフォーム画面。
なんの変哲もない、ファイル送信用のフォームです。
【index.php】<form action="generate.php" method="POST" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" name="submit" value="Send">
</form>
次にファイルを加工する画面。
【generate.php】<?php
if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
$date = date('YmdHid');
$upfile = $date.'_up.txt';
$dlfile = $date.'_dl.txt';if (move_uploaded_file(
$_FILES['upfile']['tmp_name'],
$upfile
)) {
//変換後のファイルを作成
touch($dlfile);
//パーミッションを変更
chmod($upfile, 0666);
chmod($dlfile, 0666);//ファイルを開く
$fp1 = fopen($upfile, 'r');
$fp2 = fopen($dlfile, 'w');
//1行ずつ処理する
for ($i=1; $line=fgets($fp1); $i++) {
//何らかの加工を行う
//加工後のファイルに書きこむ
fwrite($fp2, $line);
}
//変換前のファイルを削除
unlink($upfile);//JavaScriptでダウンロード用のページへジャンプする
echo "<script type=\"text/javascript\">location.href = 'download.php?dlfile=$dlfile'</script>";
} else {
echo 'ファイルを送信できませんでした。';
}
} else {
echo 'ファイルが選択されていません。';
}
?>
最後に、ダウンロードさせる画面。
変換処理とダウンロード処理を分けることで、大きなファイルを処理する際、
【download.php】<?php
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename={$_GET['dlfile']}");
readfile($_GET['dlfile']);//変換後のファイルを削除
if (file_exists($_GET['dlfile'])) unlink($_GET['dlfile']);
?>
途中経過を"echo"でユーザに知らせることができます。
…もっと簡単な方法があったら、教えてくださいm(_ _)m