(PHP, JavaScript)フォーム送信されたファイルを加工後にダウンロードさせる処理


【参考】
ダウンロード後のファイルを削除したい - PHPプロ!Q&A掲示
http://www.phppro.jp/qa/1339


下記の一連の処理を、cronなど面倒な処理を使わず、
なるべく簡単に、そしてユーザに親切な処理を作ることを目指します。


  1. ユーザがファイルをフォーム送信する。
  2. PHPでファイルを加工する。
  3. ユーザにダウンロードさせる。
  4. サーバ側に残っているファイルを削除する。

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