제목 | 다운로드 헬퍼 통해서 파일 다운로드 시, 사파리의 경우, 한글 파일명이 깨지는 현상이 발생하는데 | ||
---|---|---|---|
카테고리 | PHP | ||
글쓴이 | 그동안 | 작성시각 | 2021/01/18 14:20:47 |
|
|||
안녕하세요, 다운로드 헬퍼 통해서 파일 다운로드 시, 사파리의 경우, 한글 파일명이 깨지는 현상이 발생하는데 몇일째 해결을 못하고 있는데요, 혹시 아시는 분 계실까요? 다운로드 헬퍼 코드 중 브라우저에 따라 처리하는 부분이 있는데, else if($safari) <=== 이 부분을 이렇게 저렇게 다해 봤는데 어떻게 처리할지 모르겠네요;; if ( ! function_exists('force_download')) { function force_download($filename = '', $data = '') { if ($filename == '' OR $data == '') { return FALSE; } // Try to determine if the filename includes a file extension. // We need it in order to set the MIME type if (FALSE === strpos($filename, '.')) { return FALSE; } // Grab the file extension $x = explode('.', $filename); $extension = end($x); // Load the mime types if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); } elseif (is_file(APPPATH.'config/mimes.php')) { include(APPPATH.'config/mimes.php'); } // Set a default mime if we can't find it if ( ! isset($mimes[$extension])) { $mime = 'application/octet-stream'; } else { $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; } //http_user_agent로 edge인지, ie인지, kakaotalk 인지 여부. $edge = isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== false); //엣지 $ie = isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false); //익스플로러 $safari = isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== false); //사파리 if($edge) { //파일명 rowurlencode로 인코딩. $filename = rawurlencode($filename); $filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); //헤더 변경 $header_cachecontrol = 'private, no-transform, no-store, must-revalidate'; $header_pragma='no-cache'; } else if($ie) { //헤더 변경 $filename = iconv('utf-8', 'euc-kr', $filename); //UTF-8에서 euc-kr로 변경 $header_cachecontrol = 'must-revalidate, post-check=0, pre-check=0'; $header_pragma='public'; } //사파리에서 한글 파리명이 꺠지는 문제를 해결 못함. 현재는 깨진 이름으로 다운받아지도록 놔둠. else if($safari) { ///////// 이 부분을 이렇게 저렇게 다해 봤는데도 안되네요;; } else //위 조건들이 아닌 경우,일반 헤더 적용 { $header_cachecontrol = 'private, no-transform, no-store, must-revalidate'; $header_pragma='no-cache'; } //적용될 header. 위 브라우저별로 변수를 받아서 대입,적용. header('Content-Type: "'.$mime.'"'); header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Expires: 0'); header('Cache-Control: "'.$header_cachecontrol.'"'); header("Content-Transfer-Encoding: binary"); header('Pragma: "'.$header_pragma.'"'); header("Content-Length: ".strlen($data)); exit($data); } }
===== 다운로드 컨트롤러 === //파일 다운로드 public function word_file_download() { if(!$_SERVER['HTTP_REFERER']) { alert('비정상적인 접근입니다','/'); exit; } if( $this->session->userdata('logged_in') != TRUE ) { alert('로그인 후 이용해 주세요', '/'); exit; } else { //뷰로 부터 넘겨 받은 값 $word_asis_file_name = $_GET['asis']; $word_tobe_file_name = $_GET['tobe']; $data = file_get_contents(FCPATH . "uploads/word_file/$word_tobe_file_name"); $name = $word_asis_file_name; force_download($name, $data); } }
|
|||
다음글 | 에러로그 문의드립니다!! (5) | ||
이전글 | php 셀레니움 설치 해보신분 있나요?? (1) | ||
한대승(불의회상)
/
2021/01/18 14:28:23 /
추천
0
파일명이 깨진다는게 어떤 의미인가요?
|
그동안
/
2021/01/18 14:36:18 /
추천
0
아이폰 사파리, pc 맥북 사파리에서 이렇게 됩니다. 참고로 다른 브라우저에서는 문제가 없습니다. 참고로 ie는 아래와 같이 해결했습니니다. $filename = iconv( 'utf-8' , 'euc-kr' , $filename ); //UTF-8에서 euc-kr로 변경 $header_cachecontrol = 'must-revalidate, post-check=0, pre-check=0' ; $header_pragma = 'public' ; |
한대승(불의회상)
/
2021/01/18 17:41:40 /
추천
0
일단 파일명이 utf8이 아닌 euckr로 인코딩되고 있는건 아닌지 부터 확인하셔야 할 것 같습니다.
|
그동안
/
2021/01/18 21:21:39 /
추천
0
불의화상님, $str_encode = mb_detect_encoding($filename, $encode); 이걸로 확인해본 결과, 컨트롤러를 거쳐, 다운로드 헬퍼의 아랫 부분에 대입되기 전까지는 확실히 UTF-8입니다. header('Content-Disposition: attachment; filename="'.$filename.'"');
|
한대승(불의회상)
/
2021/01/19 09:19:54 /
추천
0
@그동안 올려주신 정보와 코드를 기준으로 문제가 없어 보입니다. 사파리에서 파일명이 깨지는 이유와 해결책을 현재 저의 지식으론 제시하기가 힘들어 보입니다. 도움드리지 못해 아쉽네요. |
그동안
/
2021/01/19 09:28:02 /
추천
0
@불의화상님, 댓글 주신 것만으로 감사 드립니다. 근데, 한가지 더 궁금한게, 혹시 서버의 설정만으로 사파리만 이런 현상이 일어날 수 있을까요? 혹시나 서버쪽을 봐야 되는건가 싶어서요. |