php의 curl을 이용해서 원격지의 이미지 파일을 로컬 서버에 저장하는 기능을 수행하는 코드이다. curl 사용이 가능한 환경이어야 하며 원격지의 파일은 curl에서 접근이 가능해야 한다. 파일 다운로드 후 getimagesize 함수를 이용해 타입을 실제 파일의 타입을 체크하고 gif, jpg, png 파일이 아니면 삭제하도록 했다. curl에서 파일 체크 후 http code가 200일 때만 실행되도록 했으며 파일의 용량이 크다면 CURLOPT_CONNECTTIMEOUT 설정을 변경해서 다운로드를 할 수도 있다.
<?php
function save_remote_image($url, $dir)
{
$filename = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec ($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($http_code == 200) {
$filename = basename($url);
if(preg_match("/\.(gif|jpg|jpeg|png)$/i", $filename)) {
$tmpname = date('YmdHis').(microtime(true) * 10000);
$filepath = $dir;
@mkdir($filepath, '0755');
@chmod($filepath, '0755');
// 파일 다운로드
$path = $filepath.'/'.$tmpname;
$fp = fopen ($path, 'w+');
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_exec( $ch );
curl_close( $ch );
fclose( $fp );
// 다운로드 파일이 이미지인지 체크
if(is_file($path)) {
$size = @getimagesize($path);
if($size[2] < 1 || $size[2] > 3) {
@unlink($path);
$filename = '';
} else {
$ext = array(1=>'gif', 2=>'jpg', 3=>'png');
$filename = $tmpname.'.'.$ext[$size[2]];
rename($path, $filepath.'/'.$filename);
chmod($filepath.'/'.$filename, '0644');
}
}
}
}
return $filename;
}
?>
Copy
위 코드는 이미지만 다운로드 하지만 코드를 변경하면 다른 파일도 다운로드 가능하다.
'study' 카테고리의 다른 글
Use Google Cloud Vision API to process invoices and receipts (0) | 2021.12.30 |
---|---|
[2019.04.24] 실시간 통신 API - webSocket (0) | 2021.12.30 |
[PHP] 원격 URL의 파일을 로컬로 가져오기 (0) | 2021.12.30 |
PHP HTML 파싱 예제 (0) | 2021.12.30 |
git 명령어 간단 정리 (0) | 2021.12.30 |