url 이미지 저장문제
본문
유튜브 채널에서 이미지를 가져오려고 크롤링을 해보면 이미지 url 이 위와 같이 나옵니다.
이걸 아래의 코드로 저장하면 파일 크기가 0인 파일이 나옵니다.
아마도 해당 주소로 바로 불러와서 사용해서 그런거 같은데요,
위 주소로 조회시 나오는 이미지를 파일로 불러들여 서버에 바로 저장할수 있는 방법이
없을까요??
function save_remote_image($url2, $save_path)
{
$ch = curl_init ($url2);
curl_setopt($ch, CURLOPT_HEADER, 0); // required
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // required for images
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // maybe redirect on other side?
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'); // or user agent checks?
$data=curl_exec($ch);
curl_close ($ch);
$chars_array = array_merge(range(0,9), range('a','z'), range('A','Z'));
//아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함
$filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", basename($url2));
shuffle($chars_array);
$shuffle = implode("", $chars_array);
//첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925)
$change_filename = abs(ip2long($_SERVER[REMOTE_ADDR])).'_'.substr($shuffle,0,8).'_'.str_replace('%', '', urlencode(str_replace(' ', '_', $filename)));
$out_path = $save_path.$change_filename;
if(file_exists($out_path)) @unlink($out_path);
$fp = fopen($out_path,'x');
fwrite($fp, $data);
fclose($fp);
return $change_filename;
}
$url2 = '
https://yt3.googleusercontent.com/A7aNKwmFnBAYNek2nYfM4EzUWjw9gl0uwUUtEiOxezGMIYQ-k_hHrI0TvidaIIDdQSwu7MQc=s900-c-k-c0x00ffffff-no-rj';
$save_path = G5_DATA_PATH.'/file/'.$bo_table.'/';
$remote_image = G5_URL.'/data/file/'.$bo_table.'/'.save_remote_image($url2, $save_path);
답변 4
막아놓고 그런건 없는 것 같습니다.
아래 url에서 파싱 테스트 해보세요.
http://dev.e-naver.com/content/parsing_test.php?
참고로 깨지는 문자들은 이미지라서 그렇습니다.
파싱하시는 소스에서 $data를 한번 출력 해보세요.
$imgLink = "www.원하는 이미지 URI.com"; // 다운받을 URI
/
$linkArray = explode("/", $imgLink);/ 파일명 가져오기
$filename = $linkArray[count($linkArray)-1];
//$ext = strtolower(pathinfo($imgLink, PATHINFO_EXTENSION)); // 확장자명 가져오기
$fp = fopen("./upload/".$filename,'w'); // 저장하실 이미지 위치와 파일명
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $imgLink);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
fwrite($fp,$contents);// 가져올 외부이미지 주소
fclose($fp);
echo '<img src="/upload/'.$filename.'">';
가 보통이죠
보안상 이미지 가져가는걸 막아서 그럴수도 있으니 확인해 보셔야 할듯 합니다.
잘 됩니다. 정말 감사합니다.