소스 좀 봐주세요... ㅠㅠ;;

소스 좀 봐주세요... ㅠㅠ;;

QA

소스 좀 봐주세요... ㅠㅠ;;

본문

외부이미지를 서버에 자동으로 일괄 저장하는 소스를 사용하려고 하는데요...

팁자료실에 샤방s 님께서 올려주신 정보로 잘 사용하고 있습니다.

그런데 문제가 하나 있는데요...  어디를 어떻게 수정을 해야 될지 몰라서요...

http://img0.imgtn.bdimg.com/it/u=2462699549,577387915&fm=21&gp=0.jpg 

이렇게 정상적인 도메인으로 되어있는 이미지는 정상적으로 서버에 저장이 됩니다.

하지만 아래와 같이 도메인 앞 부분에 숫자가 있는 도메인은 저장이 않되는데요... ㅠㅠ;; 

http://40.media.tumblr.com/718655c3a30c914a68f20ac3015611ef/tumblr_ml5286IqS31s955g9o1_500.jpg 

어디를 어떻게 수정을 해야 될지 모르겠습니다.  도와주세요~ ㅠㅠ;; 

 

 

원본소스는 아래와 같습니다.

<?

include_once("./_common.php");

include_once("$g4[admin_path]/admin.lib.php");

include_once("$g4[path]/head.sub.php");

/****************************************************************************************************

*     프로그램명 : 그누보드 게시판 플러그인 - 게시판 글쓰기시 외부링크 이미지 모두 저장

*     Version : 1.30

*     제작일 : 2009-11-12 오전 00:00

*     최근 수정일 : 2009-12-19 오전 09:00

*     업데이트 내역

         1. 특정 사이트 지정 및 지정한 사이트에 대한 동작 기능 추가 (1.1버전)

2. 외부링크 이미지가 있을 경우에만 동작하고 없을 경우 그누보드 코드를 따름 (1.11버전)

3. CURL 모듈 이용 이미지 저장 방식 추가 (1.2버전)

4. referer 추가 (1.30버전)

****************************************************************************************************/

$imgSave[max] = 0; // 저장가능한 최대사이즈, max 보다 작아야만 저장한다. byte 단위, 0이면 무제한, 1MB 지정하려면 (1024*1024)

$imgSave[min] = 0; // 저장가능한 최소사이즈, min 보다 커야만 저장한다. byte 단위, 0이면 무제한

$imgSave[site] = "*"; // 사이트 지정, 쉼표로 구분, *는 전체사이트를 말함

$imgSave[mode] = 1; // 지정한 사이트의 대한 동작, 1이면 site 저장, 0이면 site 제외

$imgSave[type] = "sock"; // 이미지를 읽어오는 방식, sock : fsockopen함수 이용,     curl : CURL 모듈 이용

 

if ($imgSave[type] == "curl" && !function_exists("curl_init")) alert("CURL 모듈이 설치되어 있지 않습니다. imgSave[type]을 sock 으로 변경해주세요.");

 

$errMsg = "";

 

for($i=0; $i<300; $i++)

echo " ";

echo "\n";

flush();

 

auth_check($auth[$sub_menu], "r");

 

if ($is_admin != "super")

    alert("최고관리자만 접근 가능합니다.");

 

$sql = "select * from $g4[board_table]";

$result = sql_query($sql);

while($row = sql_fetch_array($result)){

$option .= "<option value='$row[bo_table]'>$row[bo_subject]</option>\n";

}

?>

<div style="width:90%;margin:20px;">

<h3>외부링크 이미지 일괄 저장 프로그램</h3>

<font color='red'>

본 프로그램 사용으로 인한 문제가 발생할 경우 제작자는 그 어떠한 책임도 지지 않습니다.<br>

사용 전 반드시 백업을 받으시길 권장합니다.

</font>

<fieldset style="padding:20px;">

<legend style="color:black;font-weight:bold"> 게시판 선택 </legend>

<br>

<form method="POST" onSubmit="return confirm('정말 시작하시겠습니까?');">

<input type="hidden" name="mode" value="modify">

<select name="bo_table" id="bo_table">

<option value="">게시판을 선택하세요.</option>

<?=$option;?>

</select>

<input type="submit" value="확인">

</form>

</fieldset>

</div>

<script> document.getElementById("bo_table").value = "<?=$_POST[bo_table];?>";</script>

 

<fieldset style="padding:20px;width:90%;margin:20px;height:60%;">

<legend style="color:black;font-weight:bold" id="status"> 상태창 </legend>

<br>

<div id="output" style="width:100%;height:100%;padding-top:20px;overflow:scroll">

</div>

</fieldset>

<?

if ($_POST[mode] == "modify" && $_POST[bo_table] != "")

{

$write_table = $g4['write_prefix'] . $_POST[bo_table];

$sql = "select count(wr_id) as cnt from $write_table where wr_is_comment=0";

$result = sql_query($sql);

$row = sql_fetch_array($result);

$total = $row[cnt];

$sql = "select * from $write_table where wr_is_comment=0 order by wr_id ";

$result = sql_query($sql);

$cnt=0; $cnt_ok=0; $cnt_fail=0;

 

while($row=sql_fetch_array($result)) {

$cnt++;

$_POST[wr_content] = $row[wr_content];

$img_content = image_save_run();

 

if ($img_content) $img_content = addslashes($img_content);

else $img_content = $_POST[wr_content];

$sql = "update $write_table set wr_content='". $img_content ."' where wr_id=$row[wr_id]";

@sql_query($sql);

 

if ($errMsg) {

$log = "<font color=red>[저장 실패] </font>";

$cnt_fail++;

} else {

$log = "<font color=blue>[저장 완료]</font> ";

$cnt_ok++;

}

 

$log .= "<a href='$g4[path]/bbs/board.php?bo_table=$_POST[bo_table]&wr_id=$row[wr_id]' target='_blank'>";

$log .= $row[wr_id] . ". " . addslashes(htmlspecialchars($row[wr_subject]));

$log .= "</a>";

$log .= $errMsg?"<font color=red> ($errMsg)</font>":"";

$log .= "<br>";

$errMsg = "";

echo "<script>

var log = document.getElementById('output'); 

var status = document.getElementById('status'); 

status.innerHTML = '({$cnt}/{$total})번 게시물을 읽는 중입니다.';

log.innerHTML += '".addslashes($log)."'; 

log.scrollTop = 50000;

</script>";

flush();

 

}

 

echo "<script>status.innerHTML = '<span style=font-weight:normal><b>[작업완료]</b> 총 {$total}개 게시물 [<font color=blue>저장완료: {$cnt_ok}</font>, <font color=red>저장실패: {$cnt_fail}</font>';</script>";

flush();

 

}

 

?>

 

 

 

 

 

 

<?

function remote_read_curl($urlstr) {

$url = parse_url2($urlstr);

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $urlstr); 

curl_setopt($ch, CURLOPT_REFERER, "http://$url[domain]");

curl_setopt ($ch, CURLOPT_RETURNTRANSFER,  1);

$body = curl_exec ($ch);

$header = curl_getinfo($ch);

    curl_close($ch);

 

return array("data"=>implode(";", $header)."\r\n\r\n".$body, "domain"=>$url[domain], "file"=>$url[file], "basename"=>$url[basename], "extension"=>$url[extension], "url"=>$urlstr, "header"=>$header, "body"=>$body, "filesize"=>$header[size_download]);

}

 

function remote_read_sock($urlstr) {

$url = parse_url2($urlstr);

$data = "";

$res = fsockopen($url[domain], 80, $strErrorNo, $strErrStr, 2);

if($res) {

$headerstr = "GET $urlstr HTTP/1.0\r\n"; 

$headerstr.= "Host:{$url[domain]}:80\r\n"; 

$headerstr.= "referer:http://$url[domain]\r\n";

$headerstr.= "\r\n";

fputs($res, $headerstr);

while (!feof($res)) {

$data.= fgets($res, 1024); 

fclose($res);

if (stristr($data, "Not Found") || stristr($data, "Bad Request") || stristr($data, "Forbidden"))

return false;

} else return false;

 

$patten = "/Content\\-Length:\\s+([0-9]*)\\r\\n/i";

preg_match($patten, $data, $match);

if ($match) $filesize = $match[1];

else $filesize = 0;

 

$dataset = explode("\r\n\r\n", $data);

 

return array("data"=>$data, "domain"=>$url[domain], "file"=>$url[file], "basename"=>$url[basename], "extension"=>$url[extension], "url"=>$urlstr, "header"=>$dataset[0], "body"=>$dataset[1], "filesize"=>$filesize);

}

 

function parse_url2($urlstr) 

{

$url = parse_url($urlstr);

$domain = str_replace("www.", "", $url[host]); // 도메인

$file = substr($url[path], strrpos($url[path], "/")+1); // 파일명

$basename = str_replace("%", "", substr($file, 0, strrpos($file, "."))); // 파일명 (확장자 제외)

if (empty($basename)) {

$basename = $file;

$extension = "";

} else $extension = substr($file, strrpos($file,".") + 1); // 확장자

return array("url"=>$urlstr, "domain"=>$domain, "file"=>$file, "basename"=>$basename, "extension"=>$extension);

}

 

function image_save($file, $data) {

global $g4;

@mkdir("$g4[path]/data/$g4[cheditor4]/", 0707);

@chmod("$g4[path]/data/$g4[cheditor4]/", 0707);

$ym = date("ym", $g4[server_time]);

define('SAVE_AS_DIRECTORY', "$g4[path]/data/$g4[cheditor4]/$ym/");

@mkdir(SAVE_AS_DIRECTORY, 0707);

@chmod(SAVE_AS_DIRECTORY, 0707);

 

if (!file_exists($file)) {

$fp = @fopen ($file, 'w');

if(!$fp) return false;

fwrite ($fp, $data);

fclose ($fp);

}

return true;

}

 

function image_save_run() {

global $g4, $errMsg, $imgSave;

 

$img_content = stripslashes($_POST[wr_content]);

$img_content = str_replace("<", "<", $img_content);

$img_content = str_replace(">", ">", $img_content);

$patten = "/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i";

preg_match_all($patten, $img_content, $match); 

$dest_file = "data/$g4[cheditor4]/".date("ym")."/"; //저장경로

 

 

if ($match[1]) {

foreach ($match[1] as $link) {

$url = parse_url($link);

if ($url[host] && $url[domain] != $_SERVER['HTTP_HOST']) {

$image = $imgSave[type]=="sock"?remote_read_sock($link):remote_read_curl($link);

if ($image) {

if ($imgSave[min] && $imgSave[min] > $image[filesize]) continue; // 이미지가 최소크기보다 작으면 저장안함

if ($imgSave[max] && $imgSave[max] < $image[filesize]) continue; // 이미지가 최대크기보다 크면 저장안함

$siteList = explode(",", trim($imgSave[site]));

$siteListCnt = count($siteList);

$site_exists = false; // 지정한 도메인에 포함이 되어 있는지 여부

for($c=0; $c<$siteListCnt; $c++) {

if (stristr($image[domain], $siteList[$c])) { // 지정한 도메인에 포함이 되어 있다면

$site_exists = true;

break;

}

}

 

if ($imgSave[mode]) { // action이 저장일 경우

if ($site_exists || $imgSave[site] == "*") { ; } // 사이트 목록에 있거나 전체사이트에 적용이라면

else continue;

}

else { // action이 제외일 경우

if ($site_exists || $imgSave[site] == "*") continue; // 사이트 목록에 있거나 전체사이트에 적용이라면

else { ; } // 사이트 목록에 없다면 통과

}

 

$saveFileName = $dest_file.$image[basename]."_".random_generator(8, 15) . ($image[extension]?".".$image[extension]:"");

if (image_save($g4[path]."/".$saveFileName, $image[body]))

$img_content = str_replace($link, ("../".$saveFileName), $img_content);

else $errMsg = "파일 저장 실패";

}

else $errMsg = "1개 이상 저장하지 못한 이미지 있음";

}

}

 

return $img_content;

}

else

return false;

 

}

 

function random_generator ($min=8, $max=32, $special=NULL, $chararray=NULL) { 

    $random_chars = array(); 

    

    if ($chararray == NULL) { 

        $str = "abcdefghijklmnopqrstuvwxyz"; 

        $str .= strtoupper($str); 

        $str .= "1234567890"; 

 

        if ($special) { 

            $str .= "!@#$%"; 

        } 

    } 

    else { 

        $str = $charray; 

    } 

 

    for ($i=0; $i<strlen($str)-1; $i++) { 

        $random_chars[$i] = $str[$i]; 

    } 

 

    srand((float)microtime()*1000000); 

    shuffle($random_chars); 

 

    $length = rand($min, $max); 

    $rdata = ''; 

    

    for ($i=0; $i<$length; $i++) { 

        $char = rand(0, count($random_chars) - 1); 

        $rdata .= $random_chars[$char]; 

    } 

    return $rdata; 

}

?>

이 질문에 댓글 쓰기 :

답변 1

텀블러 서버에서 해당 이미지를 퍼가지 못하게 막아 놓은 상태라면,

소스와 상관없이 가져올 수 없는 경우도 있습니다. 

답변을 작성하시기 전에 로그인 해주세요.
전체 25
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT