한게시물에 두개씩 생성된 jpg형식의 썸네일 삭제문제 > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

한게시물에 두개씩 생성된 jpg형식의 썸네일 삭제문제 정보

한게시물에 두개씩 생성된 jpg형식의 썸네일 삭제문제

첨부파일

test_gallery_skin.zip (58.9K) 6회 다운로드 2010-07-18 16:41:07

본문

앞서 질문을 한번 드렸으나, 해결이 되지 않아서 다시 한번 올려봅니다 -_- ;;
(해결은 안되고 게시물 등록하느라 포인트만 계속 날리네요 -_- ;; )


- 우선 스킨파일을 첨부했으며,
- 게시판에 따른 리스트형태를 달리하기 위해 list.skin.php파일은
- bo_1의 옵션값에 따라서 list.skin_basic.php와 list.skin_thumb_jpg.php로 구분됩니다



질문 내용은 다음과 같습니다

list.skin_thumb_jpg.php 파일을 리스트스킨의 기본으로 설정하여 사용시에
해당 리스트화면에서 게시물당 등록된 여러 이미지중 첫번째, 두번째 이미지를
썸네일 파일로 생성해서  출력해주도록 했습니다
(썸네일 형식은 ... 원본과 동일한(파일명까지) jpg형식으로 /thumb/에 저장)


현재 문제가 되는것은 생성된 썸네일이 제대로 삭제가 되지를 않습니다
썸네일의 삭제는  아래파일로 각각의 상황에 맞게 삭제하도록 되어 있는데

- delete.skin              (뷰화면에서 게시물 삭제시, 썸네일파일도 함께 삭제)
- delete_all.skin        (리스트에서 체크박스로 게시물 선택삭제시 썸네일 삭제)
- write_update.skin    (게시물수정시 파일선택삭제시 썸네일 삭제)


현재 delete_all.skin 에서만 삭제 처리가 될뿐 나머지는 확인해보면 제대록 삭제가 안되고
이전 썸네일의 찌꺼기가 그대로 남아 있습니다

★★★ 이미지파일의 썸네일 형식이 wr_id값을 이용한 생성이 아니라
j★★★ pg방식으로 원본파일을 축소변환하여 jpg포맷및 파일명을 그대로 가져온 썸네일 형태입니다

★★★ 코드나 구문을 어떻게 수정해야 할지 도움을 좀 부탁드립니다.



아래는 첨부된 스킨의 코드 일부입니다

list_skin.thumb_jpg.php ------------------------------------------------------


<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
?>

<?
if (!function_exists("imagecopyresampled")) alert("GD 2.0.1 이상 버전이 설치되어 있어야 사용할 수 있는 갤러리 게시판 입니다.", $admin_href);

// 썸네일 사이즈(가로|세로) 지정
// $thu_width = 150;  //썸네일 폭 $thu_height = 110;
list($thu_width, $thu_height) = explode("|", $board[bo_3]);

$thu_quality = 98;  //썸네일 퀄리티_100 이하

$data_path = $g4[path]."/data/file/$bo_table";
$thumb_path = $data_path.'/thumb';

@mkdir($thumb_path, 0707);
@chmod($thumb_path, 0707);

$mod = $board[bo_gallery_cols];
$td_width = (int)(100 / $mod);
?>


<!-- 게시판 목록 시작 -->
<table width="<?=$width?>" align="center" cellpadding="0" cellspacing="0">
<tr><td>

    <!-- 제목 -->
    <form name="fboardlist" method="post">
    <input type='hidden' name='bo_table' value='<?=$bo_table?>'>
    <input type='hidden' name='sfl'  value='<?=$sfl?>'>
    <input type='hidden' name='stx'  value='<?=$stx?>'>
    <input type='hidden' name='spt'  value='<?=$spt?>'>
    <input type='hidden' name='page' value='<?=$page?>'>
    <input type='hidden' name='sw'  value=''>

<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>

<?
for ($i=0; $i<count($list); $i++) {
    if ($i && $i%$mod==0)
        echo "</tr><td colspan='{$mod}' height=5></td></tr>";

$img_cnt = array() ;
for ($k=0,$img_num=0; $k<$list[$i][file][count]; $k++) {
      if($list[$i][file][$k][file]) { //break;
              $img_cnt[$img_num]=$list[$i][file][$k][file] ;
              $img_num ++;
        }
}
$max_img_cnt = count($img_cnt);
$image = $img_cnt[0];
$image2 = $img_cnt[1];

    $source_image = $list[$i][file][0][file];
    $source_image2 = $list[$i][file][1][file];

$no_img = "$board_skin_path/img/no_image.gif";

    $thumb = $thumb_path.'/'.$list[$i][file][0][file];
    $thumb2 = $thumb_path.'/'.$list[$i][file][1][file];


    if (!file_exists($thumb)) {
        $file = $list[$i][file][0][path] .'/'. $list[$i][file][0][file];
        if (preg_match("/\.(jp[e]?g|gif|png)$/i", $file) && file_exists($file)) {
            $size = @getimagesize($file);
            if ($size[2] == 1)
                $src = imagecreatefromgif($file);
            else if ($size[2] == 2)
                $src = imagecreatefromjpeg($file);
            else if ($size[2] == 3)
                $src = imagecreatefrompng($file);
            else
                continue;

            $rate = $thu_width / $size[0];
            $height = (int)($size[1] * $rate);

            if ($height < $thu_height)
                $dst = imagecreatetruecolor($thu_width, $height);
            else
                $dst = imagecreatetruecolor($thu_width, $thu_height);
            imagecopyresampled($dst, $src, 0, 0, 0, 0, $thu_width, $height, $size[0], $size[1]);
            imagejpeg($dst, $thumb_path.'/'.$list[$i][file][0][file], $thu_quality);
            chmod($thumb_path.'/'.$list[$i][file][0][file], 0707);
          }
    }

    if (file_exists($thumb)) {
        $thumbnail_img = "<img src='$thumb' width='$thu_width' height='$thu_height' border=0 style='border:3px solid #333333;'>";
}

    if (!($source_image)) {
        $thumbnail_img = "<img src='$no_img' width='$thu_width' height='$thu_height' border=0 style='border:0px solid #333333;'>";
}


    if (!file_exists($thumb2)) {
        $file2 = $list[$i][file][1][path] .'/'. $list[$i][file][1][file];
        if (preg_match("/\.(jp[e]?g|gif|png)$/i", $file2) && file_exists($file2)) {
            $size = @getimagesize($file2);
            if ($size[2] == 1)
                $src = imagecreatefromgif($file2);
            else if ($size[2] == 2)
                $src = imagecreatefromjpeg($file2);
            else if ($size[2] == 3)
                $src = imagecreatefrompng($file2);
            else
                continue;

            $rate = $thu_width / $size[0];
            $height = (int)($size[1] * $rate);

            if ($height < $thu_height)
                $dst = imagecreatetruecolor($thu_width, $height);
            else
                $dst = imagecreatetruecolor($thu_width, $thu_height);
            imagecopyresampled($dst, $src, 0, 0, 0, 0, $thu_width, $height, $size[0], $size[1]);
            imagejpeg($dst, $thumb_path.'/'.$list[$i][file][1][file], $thu_quality);
            chmod($thumb_path.'/'.$list[$i][file][1][file], 0707);
          }
    }

    if (file_exists($thumb2)) {
        $thumbnail_img2 = "<img src='$thumb2' width='$thu_width' height='$thu_height' border=0 style='border:3px solid #333333;'>";
}

    if (!($source_image2)) {
        $thumbnail_img2 = "<img src='$no_img' width='$thu_width' height='$thu_height' border=0 style='border:0px solid #333333;'>";
}


/* ---------------------- 옵션 ----------------------------------- */
    $title = "원본보기";
$file_cnt = $list[$i][file][count];  // 게시물당 등록된 파일갯수
if($file_cnt >=2) {$fcolor='#FF0000';}else{$fcolor='#888888';}  // 등록파일이 두개이상인경우, 글자색상

    //$content = cut_str(get_text($list[$i][wr_content]), 80);      // 내용보기시 글자수
//$subject = cut_str(get_text($list[$i][subject]), 20, '...');  // 제목글 글자수
$subject = $list[$i][subject];

//---- 이미지 새창보기 여부 설정
if($board[bo_2] == '1') { // 뷰화면에서 이미지보기
$view_img  = "<a href='{$g4[bbs_path]}/board.php?bo_table=$bo_table&wr_id={$list[$i][wr_id]}&page=$page'>";
$view_img2  = "<a href='{$g4[bbs_path]}/board.php?bo_table=$bo_table&wr_id={$list[$i][wr_id]}&page=$page'>";
$view_href = "<a href='{$g4[bbs_path]}/board.php?bo_table=$bo_table&wr_id={$list[$i][wr_id]}&page=$page'>";
}
if($board[bo_2] == '2') { // 리스트이미지:새창, 제목글:뷰화면
$view_img  = "<a href=\"javascript:;\" OnClick=\"image_viewer('$g4[path]/data/file/$bo_table/$image')\" onFocus=\"this.blur();\">";
$view_img2  = "<a href=\"javascript:;\" OnClick=\"image_viewer('$g4[path]/data/file/$bo_table/$image2')\" onFocus=\"this.blur();\">";
$view_href = "<a href='{$g4[bbs_path]}/board.php?bo_table=$bo_table&wr_id={$list[$i][wr_id]}&page=$page'>";
}
if($board[bo_2] == '3') { // 모두 새창으로 보기
$view_img  = "<a href=\"javascript:;\" OnClick=\"image_viewer('$g4[path]/data/file/$bo_table/$image')\" onFocus=\"this.blur();\">";
$view_img2  = "<a href=\"javascript:;\" OnClick=\"image_viewer('$g4[path]/data/file/$bo_table/$image2')\" onFocus=\"this.blur();\">";

if($member[mb_level] <= 9) {
$view_href  = "<a href=\"javascript:;\" OnClick=\"image_viewer('$g4[path]/data/file/$bo_table/$image')\" onFocus=\"this.blur();\">";
}else {
$view_href = "<a href='{$g4[bbs_path]}/board.php?bo_table=$bo_table&wr_id={$list[$i][wr_id]}&page=$page'>";
}
}

    $checkbox = "";
    if ($is_checkbox)
        $checkbox = "<input type=checkbox name=chk_wr_id[] value='{$list[$i][wr_id]}'>";

        $comment = " <a href=\"{$list[$i][comment_href]}\"><span style='font-size:8pt;'>{$list[$i][comment_cnt]}</span></a>";
/* ---------------------- 옵션 ----------------------------------- */

$style = "";
    if ($list[$i][icon_new])
        $style = " style='font-weight:bold;' ";
    $subject = "<span $style>".$subject."</span>";

    $comment_cnt = "";
    if ($list[$i][comment_cnt])
        $comment_cnt = " <a href=\"{$list[$i][comment_href]}\"><span style='font-size:8pt;color:#888888'>{$list[$i][comment_cnt]}</span></a>";

    echo "<td width='{$td_width}%' align='center' valign=top style='padding-top:5px; word-break:break-all;'>\n";

/* ------ 이미지 정보출력 start --- */

echo "<div>";
echo "{$view_img}";
echo $thumbnail_img ."</a>&nbsp;&nbsp;";
echo "{$view_img2}";
echo $thumbnail_img2 ."</a>";
echo "</div>";
echo "<div style='clear:both; text-align:center;'>";
echo "{$checkbox}&nbsp; {$view_href}";
echo "<span style='letter-spacing:-1px'>{$subject}</span></a>&nbsp;";
echo $comment_cnt;
echo "</div>";

echo "<div>";
if($board[bo_2] !== '3') {
echo "<span style='font-family:gulim, AppleGothic, sans-serif; font-size:12px;letter-spacing:-1px;'><font color='{$fcolor}'>이미지수 : {$max_img_cnt}</font>&nbsp;&nbsp;<font color='#888888'>조회 : {$list[$i][wr_hit]}</font></span>";
}
echo "</div>";

/* ------ 이미지 정보출력 end --- */

echo "</td>\n";
}

// 나머지 td
$cnt = $i%$mod;
if ($cnt)
    for ($i=$cnt; $i<$mod; $i++)
        echo "<td width='{$td_width}%'>&nbsp;</td>";
?>
</tr>
<? if (count($list) == 0) { echo "<tr><td colspan='$mod' height=100 align=center>게시물이 없습니다.</td></tr>"; } ?>

</table>
</form>


</td></tr></table>





--- 썸네일 삭제관련 delete.skin.php  -------------------------------------------------

<?
$sql_thumb = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' ";
$result_thumb = sql_query($sql_thumb);

while ($thumb_row = sql_fetch_array($result_thumb)){
@unlink("$g4[path]/data/file/$bo_table/thumb/$thumb_row[bf_file]");
}
?>


--- 썸네일 삭제관련 delete_all.skin.php  -------------------------------------------------

<?

$sqls = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' ";
$results = sql_query($sqls);
while ($rows = sql_fetch_array($results))
@unlink("$g4[path]/data/file/$bo_table/thumb/$rows[bf_file]");

?>

----- 썸네일 삭제관련  write_update.skin.php ----------------------------------------

$sqls = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' ";
$results = sql_query($sqls);
while ($rows = sql_fetch_array($results))
@unlink("$g4[path]/data/file/$bo_table/thumb/$rows[bf_file]");

댓글 전체

소스는 이상이 없습니다만 스킨에서 제일 앞쪽에서 실행되도록 하지 않아서 그런 것입니다.
특히 write_update.skin.php 는 이미 새롭게 업로드된 파일을 불러와 지우는 결과이니 예전 것은 그대로 놔둔것입니다.

파일명을 다음과 같이 변경해 보세요.

delete.skin.php 을 delete.head.skin.php 으로 변경
write_update.skin.php 을 write_update.head.skin.php 으로 변경
정.말 감사합니다 ^^ ... 이부분에 집착하는 바람에 거의 일주일을 허비했네요 ^^;;
잘 됩니다. 큰 도움이 되었습니다


★ 근데.. 위 내용중에

--- 썸네일 삭제관련 delete.skin.php  -------------------------------------------------

<?
$sql_thumb = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' ";
$result_thumb = sql_query($sql_thumb);

while ($thumb_row = sql_fetch_array($result_thumb)){
@unlink("$g4[path]/data/file/$bo_table/thumb/$thumb_row[bf_file]");
}
?>


위 부분은
다시 테스트를 해보니 delete.skin.php에 있어도 또 되는거 같은데

delete.skin.php에서도 실행이 되고
delete.head.skin.php에서 실행이 되고.... ??? 왜 이런지요?
delete.skin.php 에서 해당 구문을 제거 하셔야 할텐데요.

저 소스가 delete.head.skin.php 에서만 존재해야 한다는 말씀인듯한데요.

아니면 해당 파일이 삭제 되지않았다는 말씀이신지요?

삭제 되지 않았다면,

@unlink("$g4[path]/data/file/$bo_table/thumb/$thumb_row[bf_file]");
->
unlink("$g4[path]/data/file/$bo_table/thumb/$thumb_row[bf_file]");

로 바꿔 보세요. 그러면 에러 내용 출력될테니깐요.
댓글 감사합니다 ^^
아~~~ 제가 위에 추가로 궁금한 물음표를 단것은


<?
$sql_thumb = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' ";
$result_thumb = sql_query($sql_thumb);

while ($thumb_row = sql_fetch_array($result_thumb)){
@unlink("$g4[path]/data/file/$bo_table/thumb/$thumb_row[bf_file]");
}
?>


위 해당구문이 실행을 해보니, (물론 한군데 있다는 가정하에)

delete.skin.php 에 있을때도 실행이 되는듯 하고
delete.head.skin.php 에 있을대도 실행이 되는듯 해서 정확히 어느 자리에 있는게 맞는지
                              그리고 가능하다면 그 이유가 궁금해서 추가 질의를 해본 내용입니다.
                              작업이 완료되면 스킨을 공개할 예정이라서 가능하면 코드위치가 정확했으면 해서요
delete.head.skin.php 에 있는게 맞습니다.

1. 파일 수정이나 삭제를 시작하기전에

기존에 있던 원본 이미지를 디비에서 찾아 내서,  그와 똑같은 섬네일 이미지가 있다면,

삭제 합니다.

2. 파일 수정이나 삭제시 원본 이미지를 삭제 합니다.

3. 다시 1의 과정을 실행해도 이미 삭제된 원본이미지를 알수 없으므로 섬네일을 삭제 할 수 없습니다.

4. 게시물 리스트 페이지에 가면 원본이미지를 이용하여 다시 섬네일을 만들어 냅니다.
delete.head.skin.php 이나 delete.skin.php 이나 상관이 없습니다.
bbs폴더의 delete.php 코드에 delete.head.skin.php 나 delete.skin.php 가 모든 파일을 삭제하기 전에 실행되게 되어 있기 때문입니다.
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

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