PHPでファイルダウンロードさせる方法

まずは基本。

header('Content-Disposition: attachment; filename="hoge.txt"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.strlen($buf));
print $buf;

ファイルになってるやつをダウンロード。

header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($filepath));
readfile($filepath);


PEAR::File_Archiveが使える環境ならこっちがお勧め。
headerうんぬんを自分で書かなくていいし、
toArchive()の第1引数の拡張子を変えれば圧縮も可能。
(tar, gz, tgz, bz2, tbz, zip, gzip, ar, debが対応)


バッファの内容をa.txtとしてダウンロード。

require_once 'File/Archive.php';
$fa = new File_Archive();
$fa->extract($fa->readMemory($buf, 'a.txt'), $fa->toOutput());

ファイルをzipでダウンロード。

require_once 'File/Archive.php';
File_Archive::setOption("zipCompressionLevel", 9);
$fa = new File_Archive();
$fa->extract($filepath, $fa->toArchive("hoge.zip", $fa->toOutput()));

複数のファイルをzipでまとめて圧縮してダウンロード。

require_once 'File/Archive.php';
$fa = new File_Archive();
$src = $fa->readMulti();
$src->addSource(File_Archive::read("huge1.txt", "hoge/huge1.txt"));
$src->addSource(File_Archive::read("huge2.txt", "hoge/huge2.txt"));
$src->addSource(File_Archive::read("huge3.txt", "hoge/huge3.txt"));
$fa->extract($src, $fa->toArchive("hoge.zip", $fa->toOutput()));


extract()の第1引数が読み込み方法で、第2引数が出力方法。
上の例を少しずついじってやればいろいろな組み合わせでダウンロードできる。


ダウンロード用のtoOutput()の他にもtoFile(),toMail(),toVariable()とか
あるので非常に応用範囲が広い。