CI 묻고 답하기

제목 다운로드 문제
글쓴이 코드초보 작성시각 2015/04/03 10:14:29
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 14373   RSS
안녕하세요.
'만들면서 배우는...' 책을 따라하면서 배우고 있는 초보입니다.

질문하기 앞서 여러 게시판을 검색해 봤지만 저와 같은 경우가 없어서 질문 올립니다.

질문: 파일을 눌러서 다운하면 다운파일이 손상되있습니다.
        서버에 올려진 파일을 열어보면 정상적으로 열립니다. 그리고 서버에 올려진 화일과 다운파일 용량은 같습니다.
아래는 다운로드 코드입니다.(action/download)
function download()
	   {         
	      $this->db->select('original_name, file_name');
	      $qry = $this->db->get_where('files', array(
	         'module_name' => $this->uri->segment(5),
	         'module_no'=> $this->uri->segment(3),
	         'no' => $this->uri->segment(4)        
	      ));
	      $file = $qry->row_array();

	      if (!isset($file['file_name']))
	         alert("파일 정보가 존재하지 않습니다.");
	               
	      $original_name = $file['original_name'];

	      $this->load->helper('download');
	      $data = file_get_contents($this->input->server('DOCUMENT_ROOT')."/data/files/".$file['file_name']);
	      if(! force_download(mb_convert_encoding($original_name,'euc-kr','utf8'), $data))
	      	alert('파일을 찾을 수 없습니다.');
	   }

파일 : original_name;?>

그리고 위에 보시면 전달할 방법을 몰라 그냥 테이블이름을 url로 전달했는데 더좋은 방법이 있으시면 말씀해 주세요.




 
 다음글 html 한번에 출력하기 (1)
 이전글 csrf iframe에서 작동안하나요..? (1)

댓글

변종원(웅파) / 2015/04/03 17:10:27 / 추천 0
force_download 는 간단한 헬퍼라 특별히 문제될만한 것이 없습니다.
혹시 모르니 다른 컴퓨터에서 다운로드 해보세요.
코드초보 / 2015/04/06 09:23:22 / 추천 0
웅파님 답변 감사합니다.
다른 컴퓨터들에서 다운해도 마찬가지 입니다.

다운로드 화일을 메모장으로 열어보면 약간 변형이 있는것 같습니다.
가령 압축파일을 다운해서 풀어보면 헤더가 손상 되었다고 나옵니다. ;;;

 
변종원(웅파) / 2015/04/06 11:14:44 / 추천 0
서버 구성(apm?) 정보를 올려주셔야 할 것 같고.

force_download를 사용하지 말고 그냥 a 태그에 파일링크를 걸어서 다운받아보세요.

제대로 열리면 ci의 문제이고 그것도 동일하게 안열리면 서버 또는 기타 환경적 문제입니다.
코드초보 / 2015/04/06 18:27:09 / 추천 0
안녕하세요. 웅파님~
서버구성은 centos6.6, apache 2.2.15, php 5.3.3, mysql 14.1 입니다.

그리고 http://192.168.120.245/data/files/ 이런식으로 접근하여 화일 다운해서 보면 정상적으로 보입니다.
그런데, <a href="http://192.168.120.245/data/files/4821a80a7f4b92fb4f63ffb0000d3596.txt">다운로드 </a> 이렇게 링크걸고 다운하면
화일이 깨져서 보이네요. ;;

초보인지라 어디를 손봐야 할지도 모르겠고, 몇일째 답보 상태 입니다.;;;;

혹시 아파치나 php 등 mime 설정을 해야할까요??
 
코드초보 / 2015/04/07 10:35:38 / 추천 0
웅파님 답변 항상 고맙습니다.
문제는 해결 했습니다만, 원인이 무엇인지는 모르겠네요. ;;
 
$data = $this->input->server('DOCUMENT_ROOT')."/data/files/".$file['file_name'];
       header('Content-Description: File Transfer');
   header('Content-Type: application/octet-stream');
   header('Content-Disposition: attachment; filename='.basename(iconv('UTF-8','EUC-KR',$file['original_name'])));
   header('Expires: 0');
   header('Cache-Control: must-revalidate');
   header('Pragma: public');   
   ob_clean();
   flush();
   readfile($data);

위와 같이 코드를 변경하니 이상없네요. ~ 저와 같은 경험인분 참고 하세요.~
변종원(웅파) / 2015/04/07 10:49:23 / 추천 0
octet-stream 넣은것 보니 샘플의 확장자는 txt인데 다른 포맷인거 같네요.
(확장자와 실제 포맷이 다르면 문제가 생길 수 있습니다. 해킹용 exe파일을 gif로 고쳐서 올리는 경우..)