Hatena::ブログ(Diary)

ゆるゆると

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

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()とか

あるので非常に応用範囲が広い。