제로보드 관련된 유용한 정보를 공유하는 곳입니다.
  • 웹미니 한줄 전광판 영역 입니다.
글 수 98

19

조회 수 : 5259 신고 : 0

profile
작성자 : title: [ani]깜빡이는 표정빽짱구
포인트 : 56933 | 레벨 : 25
출처 :  
http://www.nzeo.com/bbs/zboard.php?id=cgi_tip&page=29&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=2781[관련내용 설명]

## 제로보드 글쓰기의 파일 업로드 기능을 적용시킨 것입니다.

## 확장자가 html, php 관련 문서는 업로드가 안됩니다.

## 현재 첨부용량은 특별히 제한을 두지 않았습니다.

## 첨부된 파일이 있을 경우 보낸 사람의 보낸 메세지, 받은 사람의 받은 메세지에 첨부파일이 링크돼 있어 다운로드 받을 수 있습니다.

## 업로드 된 파일은 보낸 사람이 보낸 메세지를 삭제했을 경우에 지워집니다. 즉, 받은 사람은 메세지를 삭제해도 파일은 서버상에 남아있습니다.

## 첨부된 파일의 링크는 받은 사람이 메세지를 읽었든 안 읽었든 보낸 사람이 보낸 메세지를 지우면 링크는 안보이고 메세지를 안 지우면 링크 표시가 계속 남아있습니다. 즉, 보낸 사람이 첨부파일 삭제권한을 갖습니다.
(물론 메세지를 지우면 서버에 저장된 파일도 지워지겠지요.)

## member_memo.php, member_memo2.php 파일에 일정기간이 지나도 보낸 사람이 보낸 메세지를 삭제하지 않았을 경우 자동으로 지우는 기능이 있는데,
현재는 그 부분을 건드리지 않아 메세지만 지워질 뿐 서버에 저장된 파일은 삭제되지 않습니다.(여러가지 이유로 적용 안시켰습니다.)

## 아래와 같은 방식으로 파일첨부를 두 개, 세 개 계속 늘릴 수 있습니다.

## 명랑폐인님이 만드신 애플릿을 이용한 실시간에 가까운 쪽지기능을 이용하면 일반 메신저와 가깝게 사용할 수 있으실 겁니다.
(사실 파일전송이야 업로드 속도에 큰 영향을 받으니까요.)



일단 제로보드의 디비필드와 소스를 변경하는 것이기에 사용하실 분들은 신중을 기해주시기 바랍니다.

복잡한거 같지만 천천히 따라하시면 아주 쉽습니다.

먼저 소스를 수정하기 전에 만일의 사태에 대비해 위의 4개 파일과 현재 DB의 데이터를 백업해 두시면 좋겠죠?



[수정하기]

## 먼저 수정할 파일의 이름을 알아보도록 하지요.

** view_info.php 쪽지 보내기
        기존의 디자인에 쪽지 제목 쓰는 곳과 내용 쓰는 곳 중간에 파일 첨부 input 태그를 넣어야겠죠.
        또 파일을 전송하므로 form 태그에 ENCTYPE="multipart/form-data" 를 넣어주어야 하구요.

** member_memo.php 받은 쪽지함
        받은 메모내용 앞에 첨부파일이 있으면 링크를 걸어 보여줘야 겠네요.

** member_memo2.php 보낸 쪽지함
        역시, 보낸 메모내용 앞에 첨부파일이 있으면 링크를 걸어 보여줘야 겠구요,
        보낸 쪽지를 지우면 서버에 저장된 파일을 삭제하고, 받은사람 메모중에 첨부파일 내용을 DB에서 삭제해야겠죠.

** send_message.php 쪽지 보내주는 파일
        기존처럼 쪽지도 보내고 첨부된 파일이 있을 경우 첨부파일을 서버(http://www.홈피주소.com/zboard/upfile 요건 좀 있다가 만들어야죠...)에 저장합니다.
        같은 이름의 파일이 있으면 따로 디렉토리를 만들어 저장을 할꺼구요,
        동시에 DB에 내용을 저장해 주고요.        

위의 4개 파일만 수정하면 됩니다.




자, 시작합니다.




1. 첨부될 파일이 저장될 디렉토리 만들기
제로보드 폴더 안에 upfile 이라는 디렉토리를 하나 만들고 퍼미션을 777로 주세요.





2. DB 필드 추가
요게 좀 힘드실꺼에요.... 하지만.... 유용한 팁공유를 잘 찾아보시면 필드추가하는 팁이 많이 있어요.
저도 다 여기서 배웠습니다.
텔넷에 익숙치 않으시거나 아예 텔넷이 지원 안되시는 분들은 phpMyAdmin 같은 툴을 이용하시면 아주 편리합니다.

첨부할 파일경로+파일명, 파일명이 저장될 필드 두 개를 get_memo_table 과 send_memo_table 에 모두 추가합니다.

file_name1   VARCHAR(255) NULL허용 기본값 NULL
s_file_name1 VARCHAR(255) NULL허용 기본값 NULL


만약 첨부파일이 aaa.zip 이라면
file_name1   에는 upfile/aaa.zip 이란 데이터가 저장될 것이고,
s_file_name1 에는 aaa.zip 만 저장됩니다.





3. 파일 수정입니다.

///////////////////////////////////////////////////////////////////////////

[view_info.php]

78번 라인
<form method=post action=send_message.php name=write>
이것을
<form ENCTYPE="multipart/form-data" method=post action=send_message.php name=write>



117번 라인
<tr>
  <td width=50 align=right><img src=images/vi_subject.gif></td>
  <td> <input type=text style=width:80% name=subject class=input style=border-color:#d8b3b3> <input type=hidden name=html value=0></td>
</tr>

이것을

<tr>
  <td width=50 align=right><img src=images/vi_subject.gif></td>
  <td> <input type=text style=width:80% name=subject class=input style=border-color:#d8b3b3> <input type=hidden name=html value=0></td>
</tr>
<tr>
  <td width=50 align=right>첨부</td>
  <td> <input type=file style=width:80% name="file1" class=input style=border-color:#d8b3b3;>
  </td>
</tr>

이렇게 해서 파일 첨부부분 추가

///////////////////////////////////////////////////////////////////////////




///////////////////////////////////////////////////////////////////////////

[member_memo.php]

38번 라인

// 선택된 메모가 있을시 데이타 뽑아오기;;
        if($no) {
                $now_data=mysql_fetch_array(mysql_query("select a.subject as subject, a.reg_date as reg_date, a.readed as readed, b.name as name, a.member_from as member_from, a.memo as memo from
                $get_memo_table a, $member_table b where a.member_from=b.no and a.no='$no' and a.member_no='$member[no]'"));
                if($now_data[readed]==1) {
                        mysql_query("update $get_memo_table set readed='0' where no='$no' and member_no='$member[no]'");
                        $check=mysql_fetch_array(mysql_query("select count(*) from $get_memo_table where readed='1' and member_no='$member[no]'"));
                        mysql_query("update $send_memo_table set readed='0' where reg_date='$now_data[reg_date]' and member_to='$member[no]'");
                        if(!$check[0]) mysql_query("update $member_table set new_memo='0' where no='$member[no]'");
                }
        }


이것을


// 선택된 메모가 있을시 데이타 뽑아오기;;
        if($no) {
                $now_data=mysql_fetch_array(mysql_query("select a.subject as subject, a.reg_date as reg_date, a.readed as readed, b.name as name, a.member_from as member_from, a.memo as memo, a.file_name1 as file_name1, a.s_file_name1 as s_file_name1 from
                $get_memo_table a, $member_table b where a.member_from=b.no and a.no='$no' and a.member_no='$member[no]'"));
                if($now_data[readed]==1) {
                        mysql_query("update $get_memo_table set readed='0' where no='$no' and member_no='$member[no]'");
                        $check=mysql_fetch_array(mysql_query("select count(*) from $get_memo_table where readed='1' and member_no='$member[no]'"));
                        mysql_query("update $send_memo_table set readed='0' where reg_date='$now_data[reg_date]' and member_to='$member[no]'");
                        if(!$check[0]) mysql_query("update $member_table set new_memo='0' where no='$member[no]'");
                }
        }








185번 라인

<?=autolink(nl2br(stripslashes(del_html($now_data[memo]))))?><br>

이것을
            <?
            if($now_data[s_file_name1])
                    echo("<font color=red><b>[첨부]</b></font> <a href=$now_data[file_name1]><font color=blue>$now_data[s_file_name1]</font></a><br><br>");
            ?>
            <?=autolink(nl2br(stripslashes(del_html($now_data[memo]))))?><br>


이렇게 수정합니다.

///////////////////////////////////////////////////////////////////////////




///////////////////////////////////////////////////////////////////////////

[member_memo2.php]


19~38번 라인

// 선택된 메모 삭제;;;
        if($exec=="del_all") {
                for($i=0;$i<count($del);$i++) {
                        mysql_query("delete from $send_memo_table where no='$del[$i]'");
                }
                mysql_close($connect);
                movepage("$PHP_SELF?page=$page");
        }

// 메모삭제
        if($exec=="del") {
                mysql_query("delete from $send_memo_table where no='$no' and member_no='$member[no]'");
                mysql_close($connect);
                movepage("$PHP_SELF?page=$page");
        }

// 선택된 메모가 있을시 데이타 뽑아오기;;
        if($no) {
                $now_data=mysql_fetch_array(mysql_query("select a.subject as subject, a.reg_date as reg_date, a.readed as readed, b.name as name, a.member_to as member_to, a.memo as memo from $send_memo_table a, $member_table b where a.member_to=b.no and a.no='$no' and a.member_no='$member[no]'"));
        }



이것을



// 선택된 메모 삭제;;;
        if($exec=="del_all") {
                for($i=0;$i<count($del);$i++) {
                        
                        //////////// 첨부 파일 존재하면 차례로 지우고 받은 사람 메모에서 첨부파일 부분 정보 삭제
                        $f1 = mysql_fetch_array(mysql_query("select file_name1 from $send_memo_table where no='$del[$i]'"));
                                if($f1[file_name1]){
                                        @unlink($f1[file_name1]);
                                        mysql_query("update $get_memo_table set file_name1='', s_file_name1='' where member_from='$member[no]' and file_name1='$f1[file_name1]'");
                                        
                                }
                        /////////////////////////////////////////
                                        
                        mysql_query("delete from $send_memo_table where no='$del[$i]'");
                }
                mysql_close($connect);
                movepage("$PHP_SELF?page=$page");
        }

// 메모삭제
        if($exec=="del") {
                
                //////////// 첨부 파일 존재하면 차례로 지우고 받은 사람 메모에서 첨부파일 부분 정보 삭제
                $f1 = mysql_fetch_array(mysql_query("select file_name1 from $send_memo_table where no='$no' and member_no='$member[no]'"));
                                if($f1[file_name1]){
                                        @unlink($f1[file_name1]);
                                        mysql_query("update $get_memo_table set file_name1='', s_file_name1='' where member_from='$member[no]' and file_name1='$f1[file_name1]'");
                                }
                /////////////////////////////////////////
                
                mysql_query("delete from $send_memo_table where no='$no' and member_no='$member[no]'");
                mysql_close($connect);
                movepage("$PHP_SELF?page=$page");
        }

// 선택된 메모가 있을시 데이타 뽑아오기;;
        if($no) {
                $now_data=mysql_fetch_array(mysql_query("select a.subject as subject, a.reg_date as reg_date, a.readed as readed, b.name as name, a.member_to as member_to, a.memo as memo, a.file_name1 as file_name1, a.s_file_name1 as s_file_name1 from $send_memo_table a, $member_table b where a.member_to=b.no and a.no='$no' and a.member_no='$member[no]'"));
        }
이렇게 수정해 주시구요,




174번 라인

            <?=autolink(nl2br(stripslashes(del_html($now_data[memo]))))?><br>

이것을

           <?
            if($now_data[s_file_name1])
                    echo("<font color=red><b>[첨부]</b></font> <a href=$now_data[file_name1]><font color=blue>$now_data[s_file_name1]</font></a><br><br>");
            ?>            
            <?=autolink(nl2br(stripslashes(del_html($now_data[memo]))))?><br>

이렇게 고쳐주시면 됩니다.

///////////////////////////////////////////////////////////////////////////




///////////////////////////////////////////////////////////////////////////

[send_message.php]

20번 라인부터 맨 밑부분 까지

// 쪽지 보내기일때;;
        if($kind==1$member[no]$data[no]) {
                if(isblank($subject)) Error("제목이 없습니다. 제목을 입력해 주십시오.");
                if(isblank($memo)) Error("내용이 없습니다. 내용을 입력해 주십시오.");

                $subject=addslashes($subject);
                $memo=addslashes($memo);
                $reg_date=time();



이 부분부터 아래를 전부 이렇게 바꿉니다.


// 쪽지 보내기일때;;
        if($kind==1$member[no]$data[no]) {
                if(isblank($subject)) Error("제목이 없습니다. 제목을 입력해 주십시오.");
                if(isblank($memo)) Error("내용이 없습니다. 내용을 입력해 주십시오.");

                $subject=addslashes($subject);
                $memo=addslashes($memo);
                $reg_date=time();



        /***************************************************************************
         * 업로드가 있을때
         **************************************************************************/
        if($HTTP_POST_FILES[file1]) {
                $file1 = $HTTP_POST_FILES[file1][tmp_name];
                $file1_name = $HTTP_POST_FILES[file1][name];
                $file1_size = $HTTP_POST_FILES[file1][size];
                $file1_type = $HTTP_POST_FILES[file1][type];
        }
        if($file1_size>0$file1) {

                if(!is_uploaded_file($file1)) Error("정상적인 방법으로 업로드 해주세요");
                $file1_size=filesize($file1);                

                // 업로드 금지
                if($file1_size>0) {
                        $s_file_name1=$file1_name;
                        if(eregi(".inc",$s_file_name1)||eregi(".phtm",$s_file_name1)||eregi(".htm",$s_file_name1)||eregi(".shtm",$s_file_name1)||eregi(".ztx",$s_file_name1)||eregi(".php",$s_file_name1)||eregi(".dot",$s_file_name1)||eregi(".asp",$s_file_name1)||eregi(".cgi",$s_file_name1)||eregi(".pl",$s_file_name1)) Error("Html, PHP 관련파일은 업로드할수 없습니다");

                        //확장자 검사
                        $temp=explode(".",$s_file_name1);
                        $s_point=count($temp)-1;

                        $file1=eregi_replace("\\","\",$file1);
                        $s_file_name1=str_replace(" ","_",$s_file_name1);
                        $s_file_name1=str_replace("-","_",$s_file_name1);

                        // 디렉토리를 검사함
                        if(!is_dir("upfile")) {
                                @mkdir("upfile",0777);
                                @chmod("upfile",0777);
                        }

                        // 중복파일이 있을때;;
                        if(file_exists("upfile/".$s_file_name1)) {
                                @mkdir("upfile/".$reg_date,0777);
                                if(!move_uploaded_file($file1,"upfile/".$reg_date."/".$s_file_name1)) Error("파일업로드가 제대로 되지 않았습니다");
                                $file_name1="upfile/".$reg_date."/".$s_file_name1;
                                @chmod($file_name1,0777);
                                @chmod("upfile/".$reg_date,0777);
                        } else {
                                if(!move_uploaded_file($file1,"upfile/".$s_file_name1)) Error("파일업로드가 제대로 되지 않았습니다");
                                $file_name1="upfile/".$s_file_name1;  
                                @chmod($file_name1,0777);
                        }
                }
          }

        ///////////////////////////////////////////////////////////////////////////

                mysql_query("insert into $get_memo_table (member_no,member_from,subject,memo,readed,reg_date,file_name1,s_file_name1) values ('$data[no]','$member[no]','$subject','$memo',1,'$reg_date','$file_name1','$s_file_name1')") or error(mysql_error());
                mysql_query("insert into $send_memo_table (member_to,member_no,subject,memo,readed,reg_date,file_name1,s_file_name1) values ('$data[no]','$member[no]','$subject','$memo',1,'$reg_date','$file_name1','$s_file_name1')") or error(mysql_error());
                mysql_query("update $member_table set new_memo=1 where no='$data[no]'") or error(mysql_error());
                echo"<script language="javascript">alert("$data[name] 님께 쪽지를 보냈습니다");window.close();</script>";
        }

        mysql_close($connect);
?>


///////////////////////////////////////////////////////////////////////////




끝났습니다.

성공하시길 빌면서....

profile 글쓴이 빽짱구

단점이 없는 사람은 장점도 거의 없다 - 에이브러햄 링컨

엮인글 :
https://web.webmini.net/zb4/17416/63e/trackback
소중한 댓글 부탁드립니다.
추천수 10단위당 메달이 1개씩 노출되고, 추천수에 따라 배경색이 변하며, 일정수의 추천수를 받을시 BEST 아이콘이 붙게됩니다.
추천수에 따른 배경색 보기 본문으로 바로가기
  • 추천수 50개이상
  • 추천수 30개이상
  • 추천수 20개이상
  • 추천수 10개이상
  • 추천수 3개이상
닫기

댓글 '1'

맑은숲 (17417)

2004.10.31 16:21:35

아흐....어려버라......ㅡ.ㅡ;;
List of Articles
번호 제목 글쓴이 날짜 추천 수 조회 수sort
98 hit best of best 쪽지창을 메신저처럼 하기 file [4] title: [ani]깜빡이는 표정빽짱구 2006-11-16 50 17805
97 hit best of best 제로보드 pl8 보안 취약점 패치하세요 [2] title: [ani]깜빡이는 표정빽짱구 2006-06-17 63 10263
96 best of best 제로보드 서버이전 방법 title: [ani]깜빡이는 표정빽짱구 2004-07-12 25 8845
95 best of best 자동글 등록방지하기(광고글) file [1] title: [ani]깜빡이는 표정빽짱구 2006-09-16 35 7588
94 best of best 최근게시물에 카테고리 뽑아오기 [1] title: [ani]깜빡이는 표정빽짱구 2006-11-15 42 7468
93 게시판타이틀메뉴 자동 생성 + 카테고리--->이미지로 바꿀수 있음. title: [ani]깜빡이는 표정빽짱구 2006-06-22 15 7087
92 best of best 글읽기 권한 없을때 로그인 페이지만드는 방법 [1] title: [ani]깜빡이는 표정빽짱구 2006-10-23 38 6888
91 best of best 최근게시물에 new 아이콘 달기 title: [ani]깜빡이는 표정빽짱구 2006-11-15 46 6822
90 best of best 로그아웃시 원하는 페이지로 이동 시키기 title: [ani]깜빡이는 표정빽짱구 2006-10-24 35 6808
89 best of best 최근게시물 클릭시 권한이 없을때 로그인페이지로 이동하기 [1] title: [ani]깜빡이는 표정빽짱구 2006-10-23 45 6449
88 best of best 레벨별로 오른쪽 마우스 금지하기 title: [ani]깜빡이는 표정빽짱구 2006-10-30 44 6248
87 일정시간 페이지사용이 없을시 로그아웃버튼 먹통일때 title: [ani]깜빡이는 표정빽짱구 2006-10-23 12 5762
86 best of best 제로보드 에러 페이지를 경고창으로 띄우기 title: [ani]깜빡이는 표정빽짱구 2006-10-26 26 5628
85 best of best 도배방지 하루 글쓰기 코맨트쓰기 제한하기 title: [ani]깜빡이는 표정빽짱구 2004-04-10 22 5542
84 로그인 자동으로 커서놓기 title: [ani]깜빡이는 표정빽짱구 2006-10-24 18 5458
83 제로보드 비밀글관련 보안패치 4.1 pl7 title: [ani]깜빡이는 표정빽짱구 2005-04-06 17 5435
82 쪽지에 파일을 첨부하자!!! [1] title: [ani]깜빡이는 표정빽짱구 2004-10-24 19 5259
81 회원 탈퇴할 때 비밀번호와 주민등록번호 확인후 탈퇴시키기 title: [ani]깜빡이는 표정빽짱구 2005-01-02 16 5120
80 제로보드, 쪽지오면 자동쪽지함 띄우기 title: [ani]깜빡이는 표정빽짱구 2004-03-07 14 5089
79 자동로그인 경고창에서 [확인] 클릭시 바로 로그인 title: [ani]깜빡이는 표정빽짱구 2006-10-23 19 5085