개발 Q&A

제목 [PHP] 오라클의 long raw타입의 데이터(파일데이터)를 쿼리하여, 파일 다운로드 하는 방법
카테고리 PHP
글쓴이 layman 작성시각 2017/09/21 16:55:31
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 14244   RSS

db에 long raw타입 데이터(파일정보)가 있어요. 

 

이걸 쿼리 결과로 가져와서, 파일을 다운로드하려합니다.

 

예전에 long raw타입데이터를 가져와서 img태그로 보여줄 때에는 

"<img src='data:image/gif;base64," . base64_encode($row['DATA'][0]) . "'/>";

이런 식으로 사용을 했었는데요.

 

이번엔 <a href="/file/file_download" file_id="xxx">다운로드</a>

 

model.php에서

$this->db->where('file_id', 'xxx');

$q = $this->db->get('files');

if($q->num_rows() > 0)

{

$r = $q->row_array();

}

 

이렇게하여 $r['DATA']; 안에 long raw타입의 데이터가 들어가있는 상태에요.

파일을 다운로드하게하려면 어떻게 구현해야할지 잘 모르겠어요.

 

도움주시면 감사하겠습니다.

 다음글 완전 초보 질문드립니다. (3)
 이전글 파일 경로가 맞는데 호출이 안됩니다. (1)

댓글

변종원(웅파) / 2017/09/21 21:43:56 / 추천 0

바이너리이니 fwrite() 함수로 파일로 만드시고 다운로드 해도 되고

ci의 force_download() 함수로 바로 다운로드해도 될 것 같습니다.

layman / 2017/09/22 09:52:16 / 추천 0

1. force_download($data['FILEREMARK'], $data['FILEDATA']);

 

2. 

$handle = fopen($data['FILEREMARK'], 'w');
 
fwrite($handle, $data['FILEDATA']);
 
fclose($handle);
 
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($data['FILEREMARK']));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($data['FILEREMARK']));
readfile($data['FILEREMARK']);
 
exit;

$data['FILEREMARK']는 파일명이구요.

$data['FILEDATA']는 long raw 타입 데이터입니다. (4D5A90000300000004000000FFFF0000B800000000000000 ...)

두 가지 방법 모두 반응이 없습니다.

layman / 2017/09/22 11:12:01 / 추천 0
1,2번 두 방법 모두 개발자도구 response에 

이렇게 출력되고 다른 반응은 없네요.

 

변종원(웅파) / 2017/09/22 11:26:30 / 추천 0

오라클이네요. ^^;;

화면출력을 먼저하고 ob_start 함수로 화면출력을 파일로 저장해야할 것 같네요. http://php.net/manual/kr/function.ob-start.php

오라클 php 이미지 입출력 참고 - https://docs.oracle.com/cd/E17781_01/appdev.112/e18555/ch_twelve_blobs.htm#TDPPH187

layman / 2017/09/22 14:29:09 / 추천 0

 

Ajax get방식으로 /etc/file_download/17 < 17은 파일 고유ID

다운로드 하는 코드

 

response header에 파일 데이터가 읽혀졌습니다.

이제 파일 다운로드가 자동으로 실행되게끔 해야하는데.. 이건 원래 php에서 force_download실행하면 자동으로

브라우저에서 다운로드 창이 팝업되지 않나요?

따로 추가해야 할 코드가 있을지.. 거의 다 온거 같은데 다운로드 팝업창이 안뜨고있네요.

layman / 2017/09/22 14:58:54 / 추천 0

특이사항

 

- 주소창에 /etc/file_download/17 으로 입력하고 엔터누르면 이상하게 또 바로 파일다운로드가 자동으로 됩니다.

그런데 현재 ajax get방식으로 /etc/file_download/17으로 요청을 하면, repsonse header에 데이터가 찍히고

아무런 액션이 없습니다.

layman / 2017/09/25 11:26:39 / 추천 0
document.location = url로 해결했습니다~ ㅎㅎ
변종원(웅파) / 2017/09/25 13:36:48 / 추천 0
ajax는 당연히 해당내용을 리턴하고 맙니다. 최초 답변내용에 맞는건데 내용을 잘못 넣으셨네요.