作成日: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」で調べると良さげ。