Backend/PHP

csv 대용량 파일 인코딩 후 다운로드까지

Jeffrey Oh 2019. 11. 29. 23:33

csv 대용량 파일 인코딩 후 다운로드까지


ini_set('memory_limit',-1); // 무제한
set_time_limit(0); // 무제한
 
$filename = "Temp/shoppingmall.csv"
$local_file = $_SERVER['DOCUMENT_ROOT']."/excel/".$filename;
 
$download_rate = 300// 다운로드 속도 조절(?)
 
if (is_file($local_file)) { // 파일 존재여부
 
    // 헤더설정 csv라서 EUC-KR   
    header("Content-Type: application/vnd.ms-excel; charset=EUC-KR");
    header("Content-Length: ".filesize($local_file)); 
    header("Content-Disposition: attachment; filename=shoppingmall.csv");
    header("Pragma: public"); // IE 까지 고려하면 이거 필수 없으면 안됨
 
    while (ob_get_level()) ob_end_clean(); // 현재까지 기록된거 비우기인가?
    // flush content 
    flush(); // 출력한번 해주고 왜지 ?
 
    if (($handle = fopen($filename, "r")) !== FALSE) { // 파일 읽음
        while (($row = fgetcsv($handle, 1000",")) !== FALSE) { // 1000길이씩 ,단위로 읽기
            // 읽어들인 $row를 다시 ,를 추가하여 바로 생성된 문자열을
            // UTF-8 에서 EUC-KR로 인코딩한 후 맨 끝에 개행코드 추가하여 새로운 문자열 생성
            $tempStr = iconv("UTF-8""EUC-KR", join(',',$row)) . PHP_EOL;
            // 새로운 파일에 내용 넣고 저장
            file_put_contents('Temp/shoppingmall-reversed.csv',$tempStr, FILE_APPEND);
        }
        fclose($handle);
    }
 
    // open file stream 
    $file = fopen('Temp/shoppingmall-reversed.csv'"rb");
    fpassthru($file);
    
    // close file stream 
    fclose($file);
 
    // file delete
    unlink('Temp/shoppingmall-reversed.csv');
    unlink('Temp/shoppingmall.csv');
}