[PHP] 외부서버의 이미지를 받아서 임시로 보여주고 삭제하기
실서비스가 이뤄지는 서버가 있지만 서비스 사이트에서 회원중 한분이 자신도 도메인을 가지고 같이 컨텐트를 공유하자는 목적에서 만들어지게 되었다.
물론 실서버의 자료를 다른 방식으로 모두 중간서버에 전송을 해 주면 되지만 웹호스팅을 이용할 경우에 그 많은 자료를 넣을수 없을 경우가 생기게 된다.
그래서 실서버에서 필요한 자료를 중간서버에 요청하여서 다운로드 해 놓았다가 사용자에게 보여주는 방식이다.
실서버는 모든 중간서버를 알고 있기때문에 적절하게 중간서버에게 크론으로 명령을 날려서 지우도록 종용할수도 있고, 회원정보도 xml등을 이용하여서 체크 할 수 있다.
중간서버 프로그램은 절대 중간서버에 저장하는 방식을 지원하지 않는다. 실제 서버에게 모든것을 요청하고 임시로 캐쉬 형식으로 저장해 두기때문에 큰 저장 용량과 실서버의 패치에 따라서 모든 중간서버들이 일일이 대응할 중요성은 없다.
사용언어 : PHP
필수 품 : Snoopy.class.php ( 인터넷에서 검색해서 다운 받도록)
목적 : Server -> Server -> User 로 가는 방식의 서비스 방식을 위해 제작중 탄생한 부가적인 코드
<?php
/*
* Snoopy.class.php 를 이용한 외부 사이트 이미지/파일 링크(다운)
* 임시적으로 local 에 다운 받아서 다시 읽어 들임
* 이미지가 있는 Server(Storge, local)의 주소를 알수가 없음
* 단점은 속도가 느림 Server(storge) -> Server(local) -> clint로 전송되기에 속도가 느림
* 이미지 경로를 감추기 위한 일환으로 사용하면 좋을듯 함
*
* 2012.03.19 by AoiMinamo (aoiminamo(at)gmail.com)
*/
include_once ( "./snoopy.class.php");
// 시간을 Asia/seoul로 맞춤
date_default_timezone_set('Asia/Seoul');
$timestamp = time(); // 파일을 임시적으로 작성하기에 timestamp값을 이용함
$remotely = 'http://www.google.co.kr/intl/ko_ALL/images/logos/images_logo_lg.gif'; // server(storge)의 이미지 주소
$location = "./cache/{$timestamp}.gif"; // server(local)의 저장될 이미지 주소
$snoopy = new Snoopy;
$snoopy->fetch($remotely);
// 파일을 local에 저장 함
$temp = fopen($location,'w');
fwrite ($temp,$snoopy->results);
fclose ($temp);
// local에 파일이 존재 유무 체크
if( file_exists($location) ){
$fsize = filesize($location); // 다운로드로 사용할 경우를 대비한 파일 크기
$path_parts = pathinfo($location); // 경로 정보
$ext = strtolower($path_parts["extension"]); // 확장자 정보
// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; $cdispostion = true; break;
case "exe": $ctype="application/octet-stream"; $cdispostion =true; break;
case "zip": $ctype="application/zip"; $cdispostion = true; break;
case "doc": $ctype="application/msword"; $cdispostion = true; break;
case "xls": $ctype="application/vnd.ms-excel"; $cdispostion = true; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; $cdispostion =true; break;
case "gif": $ctype="image/gif"; $cdispostion = false; break;
case "png": $ctype="image/png"; $cdispostion = false; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; $cdispostion = false; break;
default: $ctype="application/force-download"; $cdispostion = ture;
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
if($cdispostion == true) { // 다운로드로 전환할 경우에 사용함
header("Content-Disposition: attachment; filename=\"".basename($location)."\";" );
}
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile( $location );
} else {
die('File Not Found');
}
// 최종적으로 local server의 파일을 지워 버림 이곳에 조건을 넣으면은 조건에 따라서 지울수 있음
@unlink($location);
?>