作成日:2018-04-17, 更新日:2018-07-13
ファイルをダウンロード
$filePath = 対象のファイルのPATH;
$fileName = ダウンロード時のファイル名;
header('Content-Type: application/force-download');
header('Content-Length: '.filesize($filePath));
header('Content-disposition: attachment; filename="' . $fileName . '"');
readfile($filePath);
exit;
テキストをファイルでダウンロード
基本、コレをよく使うような気がする。
$fileName = ダウンロード時のファイル名;
$contents = ファイルの内容;
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="' . $fname . '"');
echo $contents;
exit;
※文字コードを気にする必要あり:「echo mb_convert_encoding($contents, 'sjis', 'utf8');」等しないとダメなときもある。
テキストをファイル出力してからダウンロード
「file_put_contents()」などで、いったんファイル出力する。
その後、ファイルをダウンロードさせる。
出力する内容が大量にあるときなどは、いったんファイル出力したほうが良いらしい。
複数のファイルをZIPにしてDL
ひとまずサーバ上でZIPを作成。DL後、サーバ上に作成したZIPを削除。
$pathAry = array();
$pathAry[] = ファイルのPATH1;
$pathAry[] = ファイルのPATH2;
// Zipクラスロード
$objZip = new ZipArchive($pathAry);
// 一時ファイル(Zip)
$zipName = "file_" . date("Ymds") .'.zip';
$zipPath = 'tmp/' . $zipName; // フォルダを指定しながら、存在してなければエラー
// Zipファイルオープン
$result = $objZip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($result !== true) {
echo "err - open zip-file";
exit;
}
// Zipに追加
set_time_limit(0);
foreach ($pathAry as $filepath) {
$filename = basename($filepath);
$objZip->addFromString($filename, file_get_contents($filepath));
}
$objZip->close();
// 出力
header('Content-Type: application/zip; name="' . $zipName . '"');
header('Content-Disposition: attachment; filename="' . $zipName . '"');
header('Content-Length: '.filesize($zipPath));
echo file_get_contents($zipPath);
// 一時ファイル削除
unlink($zipPath);
exit();
配列をCSVにして、ダウンロード
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
$fileName = 'data.csv';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
$fp = fopen('php://output', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
exit();
文字化け対策:sjis-winに変換:「foreach()」のトコを修正。
~ 略 ~
foreach ($list as $fields) {
mb_convert_variables('SJIS-win', 'UTF-8', $fields);
fputcsv($fp, $fields);
}
~ 略 ~
文字化け対策(ハートマークも対応):UTF-8(BOM有り)で保存:「foreach()」の前を修正。
~ 略 ~
fwrite($fp, "\xef\xbb\xbf"); // UTF-8(BOM有り)
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
~ 略 ~
※UTF8で出力するので・・・ExcelのバージョンやOSによっては文字化けするかも。
配列をCSVにして、サーバーに保存
$path = 保存したいPATH;
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
$fileName = 'data.csv';
$fp = fopen($path.$fileName, 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
exit();
CSVファイルの読み込み系
未調査。「fgetcsv」で調べると良さげ。