Snoopy.class 를 이용한 외부이미지 파일 저장 관련 질문입니다. 정보
Snoopy.class 를 이용한 외부이미지 파일 저장 관련 질문입니다.본문
안녕하세요
alik님의 아래 소스를 이용하여 글쓰기 저장 시 외부이미지 저장하기 기능을 시험중입니다.
하나 문제가 있는데요 찾지를 못하겠네요..흠
문제는 아래와 같습니다.
네이버의 이미지 링크나 아래와 같이 정상적인 이미지 링크는 아주 잘 됩니다.
http://blogfiles.naver.net/20100821_15/cacci95_12823614363477nxGa_jpg/iphone_0_cacci95.jpg
하지만 본문의 글을 긁어서 복사를 했을때는 아래와 같이 .jpg 끝에 ?type=w3 이라는 부분이 붙어있거나
http://postfiles16.naver.net/20100821_15/cacci95_12823614363477nxGa_jpg/iphone_0_cacci95.jpg?type=w3
아래같이 ?type=w740 이라는 부분이 붙어 있으면 이미지 저장이 안되는걸 발견했습니다..ㅠㅠ
http://cafeptthumb2.phinf.naver.net/20111121_105/bks3190_1321880454486UKmn5_jpg/dsc02202_bks3190.jpg?type=w740
정상적으로 저장이 안되니 url치환해서 저장하는 부분도 안되구요
또한 다음 같은 경우 아래같은 방법으로 이미지 링크를 시키는데요
http://cfile287.uf.daum.net/image/185D9F554E31F7A51F88BD
이런경우 이미지도 다운받지 못하고 링크도 아래처럼 만들어 버리더라구요
29_01_22_1137095838.net/image/ 이부분이 추가 되어버리더라구요
http://www.eeeee.co.kr/remoteImages/2011_11/29_01_22_1137095838.net/image/191e54544e31f7941bce8f
방긋님이 올린 아래 링크의 소스로는 이런경우 아래와 같이 링크를 만들어서 잘 보이고 있습니다.
http://www.sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=21620&sca=&sfl=mb_id%2C1&stx=seanextsky
http://www.eeee.co.kr/gnuboard4/data/cheditor4/1111/207DDA4C4E0935202B7AF0_oONQsvTyR26W3
혹시 이 문제를 해결하려면 아래 소스에서 어떤부분을 수정해줘야 하는지 아는분이 계실련지요?
아래는 alik님의 소스 입니다.
<?PHP
// made by alik
function saveRemoteImage($str) {
$myRootPath = '/APM_Setup/htdocs/'; // 서버 root 의 절대경로 (끝에 / 필수!)
$myDomain = 'localhost'; // 본인 도메인 (자기도메인에서 삽입된 이미지는 저장하지 않기 위하여)
$imgSavedir = 'remoteImages'; // 저장될 폴더의 이름 (루트에 생성하고 권한은 777 로 준다)
$myemail = "*** 개인정보보호를 위한 이메일주소 노출방지 ***"; //싸이월드 로그인용 이메일주소
$mypass = 'aaaa'; // 싸이월드 로그인용 비밀번호
include_once "Snoopy.class.php";
$content = '';
$str = stripslashes($str);
$imgPattern = "/<img.+?src=(.[^\s\>]+)/si";
preg_match_all($imgPattern,$str,$match, PREG_SET_ORDER);
if(count($match) > 0) {
$match = multi_unique($match);
}
foreach($match as $value) {
$url =$value[1];
$url = preg_replace("/(\"|\'|\\\)/","",$url);
if((strpos(strtolower($url), "http") === false) || (strpos(strtolower($url), strtolower($myDomain)) !== false)) {
continue;
}
if( strpos($url, "cyimg") !== false )
{
$snoopy = new Snoopy;
$snoopy ->referer = "http://cyworld.nate.com";
$submit_url = "http://cyxso.cyworld.nate.com/login.jsp";
$vars['myemail'] = $myemail;
$vars['mypasswd'] = $mypass;
$vars['return_domain'] = 'minihp.cyworld.nate.com';
$vars['pop'] = 'ok';
$vars['dest'] = 'http://cyworld.nate.com';
if ($snoopy -> submit($submit_url, $vars))
{
if (!strstr($snoopy -> results, "sDest"))
{
continue;
} else {
if ($snoopy -> fetch($url)) {
$content = $snoopy -> results;
} else {
continue;
}
}
} else {
continue;
}
}
else
{
$parsedUrl = parse_url($url);
$snoopy = new Snoopy;
$snoopy ->referer = $parsedUrl['scheme'].$parsedUrl['host'];
if($snoopy -> fetch($url)) {
$content = $snoopy -> results;
} else {
continue;
}
}
$newPath = $myRootPath.$imgSavedir."/";
$newPath .= date("Y_m")."/";
if(!is_dir($newPath)) {
mkdir($newPath, 0777);
chmod($newPath, 0777);
}
(strrchr($url, "."))?
$file_ext = ".".strtolower(substr(strrchr(urldecode($url), "."),1)) :
$file_ext = '';
$filename = $newPath.date("d_H_i_").mt_rand() .$file_ext;
$newFile = fopen($filename,"wb");
fwrite($newFile,$content);
fclose($newFile);
$newUrl = str_replace($myRootPath, '/', $filename);
$newTag = str_replace($value[1], "\"".$newUrl."\"", $value[0]);
$str = str_replace($value[0], $newTag, $str);
}
$str = addslashes($str);
Return $str;
}
function deleteRemoteImage($str) {
$myRootPath = '/APM_Setup/htdocs/'; // 서버 root 의 절대경로 (끝에 / 필수!)
$imgSavedir = 'remoteImages'; // 저장될 폴더의 이름 (루트에 생성하고 권한은 777 로 준다)
$str = stripslashes($str);
$imgPattern = "/<img.+?src=(.[^\s\>]+)/si";
preg_match_all($imgPattern,$str,$match, PREG_SET_ORDER);
if(count($match) > 0) {
$match = multi_unique($match);
}
foreach($match as $value) {
$url =$value[1];
$url = preg_replace("/(\"|\'|\\\)/","",$url);
$imagePath = $myRootPath . strstr($url, $imgSavedir);
@unlink($imagePath);
$folderPath = substr($imagePath, 0, strrpos($imagePath, "/"));
if ($handle = opendir($folderPath)) {
$filecount = 0;
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$filecount ++ ;
}
}
closedir($handle);
if($filecount == 0) {
rmdir($folderPath);
}
}
}
}
function multi_unique($array) {
foreach ($array as $k=>$na)
$new[$k] = serialize($na);
$uniq = array_unique($new);
foreach($uniq as $k=>$ser)
$new1[$k] = unserialize($ser);
return ($new1);
}
// made by alik
?>
alik님의 아래 소스를 이용하여 글쓰기 저장 시 외부이미지 저장하기 기능을 시험중입니다.
하나 문제가 있는데요 찾지를 못하겠네요..흠
문제는 아래와 같습니다.
네이버의 이미지 링크나 아래와 같이 정상적인 이미지 링크는 아주 잘 됩니다.
http://blogfiles.naver.net/20100821_15/cacci95_12823614363477nxGa_jpg/iphone_0_cacci95.jpg
하지만 본문의 글을 긁어서 복사를 했을때는 아래와 같이 .jpg 끝에 ?type=w3 이라는 부분이 붙어있거나
http://postfiles16.naver.net/20100821_15/cacci95_12823614363477nxGa_jpg/iphone_0_cacci95.jpg?type=w3
아래같이 ?type=w740 이라는 부분이 붙어 있으면 이미지 저장이 안되는걸 발견했습니다..ㅠㅠ
http://cafeptthumb2.phinf.naver.net/20111121_105/bks3190_1321880454486UKmn5_jpg/dsc02202_bks3190.jpg?type=w740
정상적으로 저장이 안되니 url치환해서 저장하는 부분도 안되구요
또한 다음 같은 경우 아래같은 방법으로 이미지 링크를 시키는데요
http://cfile287.uf.daum.net/image/185D9F554E31F7A51F88BD
이런경우 이미지도 다운받지 못하고 링크도 아래처럼 만들어 버리더라구요
29_01_22_1137095838.net/image/ 이부분이 추가 되어버리더라구요
http://www.eeeee.co.kr/remoteImages/2011_11/29_01_22_1137095838.net/image/191e54544e31f7941bce8f
방긋님이 올린 아래 링크의 소스로는 이런경우 아래와 같이 링크를 만들어서 잘 보이고 있습니다.
http://www.sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=21620&sca=&sfl=mb_id%2C1&stx=seanextsky
http://www.eeee.co.kr/gnuboard4/data/cheditor4/1111/207DDA4C4E0935202B7AF0_oONQsvTyR26W3
혹시 이 문제를 해결하려면 아래 소스에서 어떤부분을 수정해줘야 하는지 아는분이 계실련지요?
아래는 alik님의 소스 입니다.
<?PHP
// made by alik
function saveRemoteImage($str) {
$myRootPath = '/APM_Setup/htdocs/'; // 서버 root 의 절대경로 (끝에 / 필수!)
$myDomain = 'localhost'; // 본인 도메인 (자기도메인에서 삽입된 이미지는 저장하지 않기 위하여)
$imgSavedir = 'remoteImages'; // 저장될 폴더의 이름 (루트에 생성하고 권한은 777 로 준다)
$myemail = "*** 개인정보보호를 위한 이메일주소 노출방지 ***"; //싸이월드 로그인용 이메일주소
$mypass = 'aaaa'; // 싸이월드 로그인용 비밀번호
include_once "Snoopy.class.php";
$content = '';
$str = stripslashes($str);
$imgPattern = "/<img.+?src=(.[^\s\>]+)/si";
preg_match_all($imgPattern,$str,$match, PREG_SET_ORDER);
if(count($match) > 0) {
$match = multi_unique($match);
}
foreach($match as $value) {
$url =$value[1];
$url = preg_replace("/(\"|\'|\\\)/","",$url);
if((strpos(strtolower($url), "http") === false) || (strpos(strtolower($url), strtolower($myDomain)) !== false)) {
continue;
}
if( strpos($url, "cyimg") !== false )
{
$snoopy = new Snoopy;
$snoopy ->referer = "http://cyworld.nate.com";
$submit_url = "http://cyxso.cyworld.nate.com/login.jsp";
$vars['myemail'] = $myemail;
$vars['mypasswd'] = $mypass;
$vars['return_domain'] = 'minihp.cyworld.nate.com';
$vars['pop'] = 'ok';
$vars['dest'] = 'http://cyworld.nate.com';
if ($snoopy -> submit($submit_url, $vars))
{
if (!strstr($snoopy -> results, "sDest"))
{
continue;
} else {
if ($snoopy -> fetch($url)) {
$content = $snoopy -> results;
} else {
continue;
}
}
} else {
continue;
}
}
else
{
$parsedUrl = parse_url($url);
$snoopy = new Snoopy;
$snoopy ->referer = $parsedUrl['scheme'].$parsedUrl['host'];
if($snoopy -> fetch($url)) {
$content = $snoopy -> results;
} else {
continue;
}
}
$newPath = $myRootPath.$imgSavedir."/";
$newPath .= date("Y_m")."/";
if(!is_dir($newPath)) {
mkdir($newPath, 0777);
chmod($newPath, 0777);
}
(strrchr($url, "."))?
$file_ext = ".".strtolower(substr(strrchr(urldecode($url), "."),1)) :
$file_ext = '';
$filename = $newPath.date("d_H_i_").mt_rand() .$file_ext;
$newFile = fopen($filename,"wb");
fwrite($newFile,$content);
fclose($newFile);
$newUrl = str_replace($myRootPath, '/', $filename);
$newTag = str_replace($value[1], "\"".$newUrl."\"", $value[0]);
$str = str_replace($value[0], $newTag, $str);
}
$str = addslashes($str);
Return $str;
}
function deleteRemoteImage($str) {
$myRootPath = '/APM_Setup/htdocs/'; // 서버 root 의 절대경로 (끝에 / 필수!)
$imgSavedir = 'remoteImages'; // 저장될 폴더의 이름 (루트에 생성하고 권한은 777 로 준다)
$str = stripslashes($str);
$imgPattern = "/<img.+?src=(.[^\s\>]+)/si";
preg_match_all($imgPattern,$str,$match, PREG_SET_ORDER);
if(count($match) > 0) {
$match = multi_unique($match);
}
foreach($match as $value) {
$url =$value[1];
$url = preg_replace("/(\"|\'|\\\)/","",$url);
$imagePath = $myRootPath . strstr($url, $imgSavedir);
@unlink($imagePath);
$folderPath = substr($imagePath, 0, strrpos($imagePath, "/"));
if ($handle = opendir($folderPath)) {
$filecount = 0;
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$filecount ++ ;
}
}
closedir($handle);
if($filecount == 0) {
rmdir($folderPath);
}
}
}
}
function multi_unique($array) {
foreach ($array as $k=>$na)
$new[$k] = serialize($na);
$uniq = array_unique($new);
foreach($uniq as $k=>$ser)
$new1[$k] = unserialize($ser);
return ($new1);
}
// made by alik
?>
댓글 전체
$imgPattern = "/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i";
이 아닐까 합니다
이 아닐까 합니다