PHP CSV File Download With UTF-8 BOM Marker CodeIgniter


PHP에서 CSV 파일을 다운로드하는 것.

이 때, Text 가 UTF-8 인데, BOM Marker 없이 작성하게 되면,
MS Excel 에서 글씨가 깨진다...

PHPExcel 을 써서 10만 건 가까이 레코드가 들어 있는 테이블을 통째로 다운로드 받는 기능을
만들어 달라고 해서, 만드는데... 다운로드 시간이 너무 길거나... 메모리 부족하다고 뱉어 내거나...

그래서 그냥 CSV 로 내려줘야지 했는데, 내려 받은걸 엑셀에서 열면... 한글이 깨지고...

알아 보니 UTF-8 로 인코딩되어 있는 파일이 BOM 마커가 없으면 발생하는 일 같다...
(신기하게도 Notepad 에선 그 CSV 가 잘 보인다는 것... 한글도!)

BOM Marker 가 무엇인지는 [여기] 를 참고하시길...


==================

해결책: BOM Marker 가 없어서 그러는 것이니... BOM Marker 를 넣어주면 된다!

==================

$filename = 'filename_prefix'.date('_Ymd_His').'.csv';
header("Content-Type: application/force-download");
header('Content-Type: application/csv; charset=utf-8');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');

// open file...
$fp = fopen("php://output", 'w');

// put BOM marker
fwrite($fp, "\xEF\xBB\xBF");

// GET CSV Header Texts...
$headers = explode(',', 'No,Date,Name,Age');

// PUT CSV header line
fputcsv($fp, $headers);


// 대량의 레코드가 들어 있는 테이블에서 1000건씩 읽어 오려고 준비...
$row_start = 0;
$row_limit = 1000;

// codeigniter 의 경우이다...
$this->load->model('aa_model');

do
{
$rows = $this->aa_model->getdata( $sql['select'], $sql['table'], $sql['where'], $row_start, $row_limit );

foreach ($rows as $row)
{
fputcsv($fp, $row);
}

$row_start += $row_limit;

} while(count($rows)>=$row_limit);

fclose($fp);

=============================

결론 : BOM marker를 넣어 줬더니 MS-Excel 에서 잘 읽힌다...

끝...


덧글

댓글 입력 영역


for Androids!