<img> 태그를 이용하여 이미지를 표시하는 방법은 대개 src 속성을 이용하여 이미지 링크를 입력하는 방법을 사용한다.
하지만,
뭐 이런저런 이유로 인해서 referer를 체크하여 403 에러를 뱉어내는 사이트의 이미지를 가져와서 보여줘야 할 경우,
링크는 어떻게 긁어왔지만 그걸 <img src=""> 에 넣으면 이미지가 뜨지 않는다.
이럴 경우 PHP를 이용하여 REFERER를 속여서 이미지 데이터만을 가져온 다음,
해당 이미지를 데이터를 <img src="" 의 data, base64를 이용하여 표시할 수 있다.
<?PHP
// 이미지 데이터를 가져와서 base64 인코딩으로 변환 후 반환
function getImageData($imgLink)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $imgLink);
// referer는 적당히 연구해서 속일 것. 비워도 되는 경우도 있음.
curl_setopt($curl, CURLOPT_REFERER, '');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$img = curl_exec($curl);
curl_close($curl);
return base64_encode($img);
}
// 이미지 링크에서 이미지의 확장자를 읽어 mime type 형태로 반환
function getHeader($img)
{
$extArr = array(
'jpg' => 'image/jpg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'png' => 'image/png'
);
$ext = strtolower(substr($img, strrpos($img, '.')+1));
return $extArr[$ext];
}
// 이미지 링크가 http://example.com/img1.jpg 일 경우를 가정
$img = 'http://example.com/img1.jpg';
// base64 데이터 가져오기
$imgBase64 = getImageData($img);
// mime type 가져오기
$imgData = getHeader($img);
// 이미지 출력
echo '<img src="data:'.$imgData.';base64,'.$imgBase64.'" />';
막혔을 경우 우회하는 방식에 대한 실험적인 코드이므로 실제로 사용하기엔 설득력이 떨어짐.
트래픽도 오롯이 전부 떠 안아야 하고...
서버의 디스크에 이미지 파일을 저장해서 캐시로 사용하는 식으로 개선할 수는 있겠지만.
그냥 개인용으로 사용하기 위해 삽질하다가 나온 코드.
'PHP' 카테고리의 다른 글
[PHP] Jaccard's coefficient를 위한 intersect, union 구하는 방법. (0) | 2012.08.29 |
---|---|
[PHP] gzdecode() 함수가 없다고 에러 나올 때 (1) | 2012.08.28 |
[PHP] 흥미도 측정 (Interestingness measure) (2) | 2012.05.16 |
[PHP] date('W') 의 버그(?) (0) | 2012.05.11 |
[PHP] empty() 사용시 에러 can't use method return value in write context ... (0) | 2011.12.05 |