개발 Q&A

제목 익스플로러에서 파일다운로드시 링크로 걸려있는 파일이 다운되는 경우
카테고리 PHP
글쓴이 정수리 작성시각 2017/02/01 11:23:37
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 15909   RSS

현재 회사에서 공공기관에 납품하는 사이트를 수정 중에 있습니다.

 

수정할 부분을 다 수정한 후 테스트를 해보았는데 엉뚱한 곳에서 문제가 발생하여 글을 올리게 되었습니다.

 

문제는 되는 부분은 파일다운로드 부분입니다.

 

게시글리스트에서 제목옆에 파일아이콘이 있으면 클릭하여 다운로드 할수 있거나 게시글에 들어가서 첨부파일을 다운로드 할수 있습니다.

 

첨부파일을 다운로드의 경우 아이콘을 클릭하면 http:xxx.xx.xx/filelink.html?type=order&a=xxxxxx$name=xxxxx

 

이렇게 링크가 걸려있어 filelink로 값이 넘어간 후 파일이 다운로드가 됩니다.

 

문제되는 상황은 다른브라우저에서는 파일명이 한글일 경우 다운로드 잘되지만 유독 익스플로러에서

 

파일명이 한글을 일경우 다운을 받으면 해당파일이 아닌 filelink.html파일이 다운로드가 됩니다;

 

익스플로러에서 파일명이 영어일경에는 정상적으로 해당파일이 다운로드가 되구요;;

 

파일을 업로드할때는

서버에 $real_name = sha1($file_name.microtime());

파일명을 위처럼 주어 저장을 합니다.

phpschool에 글을 올려 얻은 답변은

1.$file_name 값을 확인

2. 1 정상이면 $fullpath상에 실제 파일이 있는지 확인

3. 2도 정상이면

Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_",urlencode($file_name));
Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_", iconv("utf-8", "euc-kr", $file_name)));

확인

 

3가지 모두 확인했을 때 이상이 없으면 파일 자체가 문제 일수도 있다는 답변을 얻었는데

 

3가지중 하나라도 잘못됐다면 익스플로러가 아닌 다른 브라우저에서도 다운로드가 안되었을 것이고

 

다른브라우저에는 정상적으로 받아지는 파일이 익스플로러에서는 안받아지니 파일 문제는 아닌것 같습니다.

 

<?php
 
  define("_BD_PATH_", "./uploads/".$_REQUEST['type']."/");
  $file_name =$_REQUEST['name'];

  $fullpath = _BD_PATH_.$_REQUEST['a'];

	if(!file_exists($fullpath)) { 				
?>
<!DOCTYPE html>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script charset='utf-8' >alert('파일을 찾을 수 없습니다.');history.back();</script>
<?php	
	exit;		
	} else {
				
    if(preg_match("/(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)/i", $_SERVER["HTTP_USER_AGENT"]) && !preg_match("/(Opera|Netscape)/i", $_SERVER["HTTP_USER_AGENT"])) {
		  Header('Content-type: application/octet-stream');	  
		  Header('Content-Length: '.filesize($fullpath));
		  Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_",urlencode($file_name)));
		  Header('Content-Transfer-Encoding: binary');
		  Header('Pragma: no-cache');
		  Header('Expires: 0');
	  } else {
		  Header('Content-type: file/unknown');
		  Header('Content-Length: '.filesize($fullpath));
		  Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_", iconv("utf-8", "euc-kr", $file_name)));
		  Header('Content-Description: PHP Generated Data');
		  Header('Pragma: no-cache');
		  Header('Expires: 0');
	  }

	  $fp = fopen($fullpath, "rb");
	  
	  while (!feof ($fp)) {
		  $buffer = fgets($fp, 8192);
		  echo $buffer;
		  flush();
	  }
	  
	  fclose ($fp);
	}
?>

 

제가 입사 전에 계셨던 분이 만드신 사이트가 제가 아직 많이 부족하여 제대로 이해를 못하고 있지만

 

제나름대로 이해한것은

 

파일을 클릭하면

 

get타입으로

 

type, a, name값이 filelink로 넘어가는데

 

type의 경우 업로드폴더에 해당되고

 

a는 서버에 저장된 파일명이며 name의 경우

 

저장할 파일의 이름값으로 filelink.html에서 설정되는것 같습니다.

 

if문에서 사용자의 브라우저가 오페라, 네스케이프가 아니면서 익스플로러일경우

 

if문의 다음의 코드가 실행이 되는데 여기서 수정을 해줘야할것같은데

 

어느 부분을 수정해야 되는걸까요 ㅜㅜ 어제 오후부터 지금까지 해결을 못하고 있네요 ㅜㅜ

 

실제 업로드 폴더에 해당 파일이 저장되어 있는 것은 확인하였습니다.

 

긴글 읽어주셔서 감사드립니다

 다음글 GIT 활용방안에 대한 고민.. (2)
 이전글 이클립스 쓰시는 분들께 질문드립니다. (6)

댓글

한대승(불의회상) / 2017/02/01 12:27:52 / 추천 1

IE는 euc-kr로 파일명을 받더라구요. 아래처럼 수정해서 테스트 해보세요.

if(preg_match("/(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)/i", $_SERVER["HTTP_USER_AGENT"]) && !preg_match("/(Opera|Netscape)/i", $_SERVER["HTTP_USER_AGENT"])) {
  Header('Content-type: application/octet-stream');  
  Header('Content-Length: '.filesize($fullpath));
  Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_", iconv("utf-8", "euc-kr", $file_name)));
  Header('Content-Transfer-Encoding: binary');
  Header('Pragma: no-cache');
  Header('Expires: 0');
} else {
  Header('Content-type: file/unknown');
  Header('Content-Length: '.filesize($fullpath));
  Header('Content-Disposition: attachment; filename='.preg_replace("/[\;]/","_",urlencode($file_name)));
  Header('Content-Description: PHP Generated Data');
  Header('Pragma: no-cache');
  Header('Expires: 0');
}

 

정수리 / 2017/02/01 12:44:17 / 추천 0

@한대승

답변감사합니다

말씀하신대로 변경한 후 다운을 받으면 filelink.html이 아닌 해당파일이 다운로드가 되네요ㅎㅎ

그런데 ㅜㅜ

파일을 열면 한글파일일 경우는 한글이 다깨지고;; 엑세파일이면 형식이 다르다는 오류가 발생하네요;;

심지어 다른 브라우저에서 다운받아도 똑같은 현상이 나타나구요 ㅜㅜ

하나를 해결하니 새로운 문제가 또 발생해버리네요 ㅜㅜ

re: 다시 해결하였습니다ㅎㅎ 상단에 공백이 있어버리니 형식이 다르다고 뜨더라구요 공백을 지우니 잘됩니다 정말 감사합니다.