WebApp/PHP2010. 6. 7. 18:43
파일 경로를 숨긴채로 전송 다운로드를 하려면, 웹 브라우저에게 스크립트 파일이 실제 파일인 것처럼 속여야 한다.

속이지 않은채로 무작정 바이너리 데이터를 전송하게 되면, 웹브라우저가 바이너리 데이터를 텍스트 데이터로 착각한다.
그래서 데이터에 EUC-KR이나, UTF-8같은 텍스트 인코딩을 적용하여 화면상에 깨진 문자들이 나타나게 된다.

그래서 바이너리 데이터, 데이터 종류(MIME type)을 인식하도록 웹 브라우저를 속이는 일련의 절차들을 거치는데
바로 헤더 메시지를 통해서 이러한 일들을 하는 것이다.
(여기서 말하는 헤더란, HTML 상에 있는 헤더 태그들과는 별개이며
클라이언트와 서버 사이에 실제 데이터의 전송을 위한 준비 과정이다.)

이 헤더는 image/bmp파일 인것으로 속이는 헤더이다.
Content-Type: image/bmp

이 헤더는 스크립트 파일을 test.bmp로 다운로드하도록 유도한다.
Content-Disposition: attachment; filename=test.bmp

위에 있는 헤더는 무조건 다운로드를 유도하기 때문에
만약 이미지 파일이나 PDF파일을 웹브라우저에서 열어보게 하고 싶은 경우에는 헤더를 변경해야 한다.
아래 있는 예제와 같이 attachment를 inline으로 변경한다.
Content-Disposition: inline; filename=test.bmp

이 헤더는 파일의 크기를 나타낸다.
Content-Length: 1289733

이러한 일련의 헤더들을 header()함수로 전송을 한다.
header("Content-Type: image/bmp");
header("Content-Disposition: attachment; filename=text.bmp");
header("Content-Length: 1289733");

이렇게 헤더를 전송하면 이후에 받을 스크립트 파일을 test.bmp라는 이미지 파일로 인지하게 된다.

스크립트 파일을 실제 이미지 파일로 내용을 채워 넣는다.
echo implode("", file("/www/text.bmp"));

이렇게 되면 웹 브라우저는 스크립트 파일의 내용을 하나의 이미지 파일로 클라이언트에 저장한다.

만약 헤더의 실제에 대해서 알아보고 싶다면, 파이어폭스Firefox에 헤더와 관련한 좋은 부가기능들이 많이 있으니 설치하여 이용하길 바란다.

MIME-Type의 종류에 대해서는 다음 링크를 통해 확인할 수 있다.
http://www.iana.org/assignments/media-types/index.html

'WebApp > PHP' 카테고리의 다른 글

다차원배열의 구성  (0) 2010.06.26
array_merge()  (0) 2010.06.25
Form과 Input 태그로 배열 넘기기  (0) 2010.06.24
파일 읽기 함수  (0) 2010.05.30
PHP 자바스크립트 경고 함수  (0) 2010.05.30
Posted by 마이클