ラボ > PHP:ファイル関連

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

サーバー上のファイルをダウンロードさせるのか、テキスト等をファイルでダウンロードさせるのか、ZIPにしてダウンロードさせるのか・・・

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

関連項目

MIMEタイプ
PHP ファイルをブラウザで表示