[펌] 간단한 멀티파일 업로더

기본적인틀은 코드프로젝트에서 따왓는데  어딘지 잘 모르겟네요

스크립트 부분만 조금 수정 했습니다.
해당 위치에 uploads폴더를 만들어 줘야 합니다.

코드 프로젝트 소스에서 파일 추가(+ 버튼)을 누르면  그전에 있던 파일명들이 사라지는
현상 때문에  그부분만 고쳐서 올렸습니다.

최대 5개까지 업로드 가능 입니다.
기본적인 옵션들은 수정 하셔서 쓰시면 될듯합니다. ^^

<?php

if($_POST[‘pgaction’]==”upload”)
    upload();
else
    uploadForm();

//The form having dynamic file uploader
function uploadForm() {
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=euc-kr” />
<title> :: FILEUPLOAD :: </title>
</head>

<body bgcolor=”#C8C8C8″ leftmargin=”0″ topmargin=”0″ rightmargin=”0″ bottommargin=”0″>
<br>
<form name=”frm” method=”post” onsubmit=”return validate(this);” enctype=”multipart/form-data”>
<input type=”hidden” name=”pgaction”>
    <?php if ($GLOBALS[‘msg’]) { echo ‘<center><span class=”err”>’.$GLOBALS[‘msg’].'</span></center>’; }?>
    <input type=’button’ value=’추가’ onclick=’appendItem()’ />
    <div id=’itemList’>
    <input type=”file”  name=”item_file[]”>
    </div>
    <input type=”submit” value=”Upload File”>
    <div id=’debug’ style=”border:1px solid #000″></div>

</form>
<script type=’text/javascript’>

    var count =0;
    function appendItem()
    {    
        count++;
        if(count > 5)
        {
            alert(“더이상의 파일을 올릴수 없습니다.”);
            count = 5;
        }
        else
        {
                //log(count);
            var newSpanItem = document.createElement(“div”);
            newSpanItem.setAttribute(“id”, “item_”+count);
            var msg_str = ‘<input type=”file”  name=”item_file[]”>’+ ‘<input type=”button” value =”삭제” onclick=”removeItem(‘+count+’)”> ‘;
            //var msg_str =”ddd<br>”;
            newSpanItem.innerHTML = msg_str;

            var itemListNode = document.getElementById(‘itemList’);
            itemListNode.appendChild(newSpanItem);
        }
    }
    

    function removeItem(idCount)
    {
        var item = document.getElementById(“item_”+ idCount);
        if(item != null)
        {
            item.parentNode.removeChild(item);
        }
        count –;
    }


    function validate(f)
    {
        var chkFlg = false;

        for(var i=0; i < f.length; i++)
        {
            if(f.elements[i].type==”file” && f.elements[i].value != “”)
            {
                chkFlg = true;
            }
        }
        if(!chkFlg)
        {
            alert(‘Please browse/choose at least one file’);
            return false;
        }
        f.pgaction.value=’upload’;
        return true;
    }
</script>
</body>
</html>
<?php
}

//function to store uploaded file

function upload(){
    
    if(count($_FILES[“item_file”][‘name’])>0)
    { //check if any file uploaded
        $GLOBALS[‘msg’] = “”; //initiate the global message
        for($j=0; $j < count($_FILES[“item_file”][‘name’]); $j++) { //loop the uploaded file array
            $filen = $_FILES[“item_file”][‘name’][“$j”]; //file name
            $path = ‘uploads/’.$filen; //generate the destination path
            if(move_uploaded_file($_FILES[“item_file”][‘tmp_name’][“$j”],$path)) { //upload the file
                $GLOBALS[‘msg’] .= “File# “.($j+1).” ($filen) uploaded successfully<br>”; //Success message
            }
        }
    }
    else
    {
        $GLOBALS[‘msg’] = “No files found to upload”; //Failed message    
    }
    
    uploadForm(); //display the main form
}
?>

[펌] 간단하게 구현하는 PHP 클래스에서의 메소드 체이닝

[알고리즘] 간단하게 구현하는 PHP 클래스에서의 메소드 체이닝  
 
 글쓴이   kirrie  날 짜 09-01-30 15:40  조 회 1004
 
 
PHP5 버전에서만 메소드체이닝이 가능합니다.


—>


http://phpschool.com/gnuboard4/bbs/board.php?bo_table=talkbox&wr_id=1389304&page=3


에서 JQuery의 메소드체이닝에 관한 jscript님의 글을 읽었습니다. 같은 테크닉이 PHP 클래스에서도 가능합니다.


메소드체이닝을 하는 가장 큰 이유는 아마도 오브젝트에 대한 빈번한 접근을 줄임으로써 퍼포먼스 향상에 약간의 이득을 볼 수 있다는 점일 것입니다. (이 부분에 대한 명확한 증거는 없습니다만, 왠지 그럴 것 같다능 -_-;; 구글링 해봐도 딱히 퍼포먼스나 리소스 관리에 효율적이라는 자료는 찾아 볼 수가 없네요.) 게다가 부가적으로는 (저는 퍼포먼스보다 이게 더 중요하다고 보지만) 시멘틱한 코드를 짤 수 있다는 장점도 있습니다.


간단한 예를 들어보겠습니다. 계산기 클래스입니다.


class Calc {


    var $amount;


    function plus($num) {
        $this->amount += $num;
        return $this;
    }


    function minus($num) {
        $this->amount -= $num;
        return $this;
    }


    function equal() {
        return $this->amount;
    }


}


$calc = new Calc;


// 1. 기존 방법을 사용해서 4 + 3 – 2를 계산함
$calc->plus(4);
$calc->plus(3);
$calc->minus(2);
echo $calc->equal(); // 5


// 2. 메소드체이닝을 사용해서 4 + 3 – 2를 계산함
echo $calc->plus(4)->plus(3)->minus(2)->equal(); // 5


메소드체이닝을 이용하니 코드량이 팍 줄었고 매우 인간 친화적인 코드가 나왔습니다.


구현 방법은 매우 간단합니다. 메소드체이닝을 적용할 메소드에서 오브젝트를 리턴하기만 하면 됩니다.
문제점이라고 한다면, 아마도 정교한 에러 핸들링 정책이 없다면 에러 발생시에 정확히 어디에서 발생했고 무엇때문에 발생했는지를 식별하기가 쉽지 않다는 것입니다. 한 라인에 걸쳐서 작성되는 코드기 때문이죠. 구더기 무서워서 장 못담그겠습니까만은..


주로 데이터베이스 클래스에서 사용하면 좋습니다. 이것도 예를 들어보지요.


“SELECT id, name, hobby, job FROM user WHERE id = ‘1’”


위의 쿼리를 기 작성된 메소드체이닝이 구현된 데이터베이스 클래스에서 사용한다고 하면 (클래스는 작성하지 않겠습니다.)


$db->select(‘id, name, hobby, job’)->from(‘user’)->where(‘id’, 1)->execute();


이렇게 작성할 수 있습니다.


[그리고 PHP4에서도 사용할 수 있었던 것으로 기억하는데, 확실하지는 않습니다. 혹시 PHP4버전을 사용중이신 분은 테스트 부탁드립니다.] <- X
PHP5에서만 동작합니다.
 
  License
본 게시물은 GPL을 따릅니다. [ GPL 안내 ] 
 
 


 
   산수익힘   09-01-30 16:37  
따로 구현을 해줘야 작동하는줄 알았는데 PHP5에서는 그냥 쓰면 되는거였군요.
이렇게 코딩하는 방법이 있었다니 미쳐 생각 못했네요 +_+;;
당장 지금 만들고 있는 클래스에 적용시켜야 겠어요~


본내용글과 관련되서 검색해서 찾아봤는데 PHP4에서는 쓸수 없다고 합니다.
요약하자면 PHP4에서 객체는 값으로 전달 되었지만 PHP5 부터는 참조로 전달되기때문에
PHP4에서는 함수에서 반환된 객체를 참조하기 힘들다 라고 하네요. 
 
따로 구현을 해줘야 작동하는줄 알았는데 PHP5에서는 그냥 쓰면 되는거였군요.
이렇게 코딩하는 방법이 있었다니 미쳐 생각 못했네요 +_+;;
당장 지금 만들고 있는 클래스에 적용시켜야 겠어요~


본내용글과 관련되서 검색해서 찾아봤는데 PHP4에서는 쓸수 없다고 합니다.
요약하자면 PHP4에서 객체는 값으로 전달 되었지만 PHP5 부터는 참조로 전달되기때문에
PHP4에서는 함수에서 반환된 객체를 참조하기 힘들다 라고 하네요.
       
   kirrie   09-01-30 19:40  
네, 저도 찾아보니 PHP5부터 가능하다고 되어 있네요. (그런데 대체 4에서도 될꺼라는 생각은 어떻게 하게 된건지… -_-;;) 
 
네, 저도 찾아보니 PHP5부터 가능하다고 되어 있네요. (그런데 대체 4에서도 될꺼라는 생각은 어떻게 하게 된건지… -_-;;)
 
   머가좋은건가요?   09-01-30 17:18  
echo $calc->plus(4)->plus(3)->minus(2)->equal(); // 5 
이런 코드 제 가슴에 꽉 박히네요
잘배웠습니다. 
 
echo $calc->plus(4)->plus(3)->minus(2)->equal(); // 5 
이런 코드 제 가슴에 꽉 박히네요
잘배웠습니다.
 
   송효진   09-01-30 18:42  
객체 자신을 계속 체이닝 하는 패턴 자체가 쉽게 나오지 않더군요.
그래서 잘 안쓰게됩니다.
뭔가 실전예제 같은게 있으면 더 좋을것 같네요.
자신이 아닌 객체를 리턴하는것을 체이닝 비슷하게 쓰기는 합니다.


$rows = $db->query(‘SELECT * FROM table LIMIT 5’)->fetchAll(); 
 
객체 자신을 계속 체이닝 하는 패턴 자체가 쉽게 나오지 않더군요.
그래서 잘 안쓰게됩니다.
뭔가 실전예제 같은게 있으면 더 좋을것 같네요.
자신이 아닌 객체를 리턴하는것을 체이닝 비슷하게 쓰기는 합니다.


$rows = $db->query(‘SELECT * FROM table LIMIT 5’)->fetchAll();
 
   행복한고니   09-01-30 19:17  
PHP4에서만 해보고 안되는 줄 알았는데, PHP5에선 되는거였군요. 
 
PHP4에서만 해보고 안되는 줄 알았는데, PHP5에선 되는거였군요.
 
   낭망백수   09-01-30 21:17  
결합된 객체나 객체 집합 iterator 구현하다보면 유용하겠네요.


감사합니다. 꾸벅~! 
 
결합된 객체나 객체 집합 iterator 구현하다보면 유용하겠네요.


감사합니다. 꾸벅~!
 
   ⓧ【태미™】   09-01-30 21:20  
좋군요. ^^ 
 
좋군요. ^^
 
   돈이최고   09-01-30 22:06  
php로도 메소드체이닝을 구현한다는게 흥미롭습니다.
자바스크립트 프레임워크 jquery는 메소드체이닝이 자주 유용하게 쓰이는 사례로 손꼽히죠.
자바스크립트로 DOM을 수정하는 것은 메소드체이닝을 활용할수있는 사례가 무궁무진하지만,
그런데 송효진님 말대로 php에서는 메소드체이닝해서 도움이 될만한 패턴사례가 있을지 궁금합니다. 
 
php로도 메소드체이닝을 구현한다는게 흥미롭습니다.
자바스크립트 프레임워크 jquery는 메소드체이닝이 자주 유용하게 쓰이는 사례로 손꼽히죠.
자바스크립트로 DOM을 수정하는 것은 메소드체이닝을 활용할수있는 사례가 무궁무진하지만,
그런데 송효진님 말대로 php에서는 메소드체이닝해서 도움이 될만한 패턴사례가 있을지 궁금합니다.
 
   다래아빠   09-01-31 09:22  
윗분들 말씀대로 php에서 체이닝 쓸 일이 그리 많지는 않을 거 같네요.


좋은 팁 감사드립니다. 🙂 
 
윗분들 말씀대로 php에서 체이닝 쓸 일이 그리 많지는 않을 거 같네요.


좋은 팁 감사드립니다. 🙂
 
   kirrie   09-01-31 14:04  
데이터베이스 클래스를 제외하고는 딱히 ‘이거다’ 싶은 것은 발견하지 못했습니다.


__call 과 같은 매직 메소드를 이용해서 동적으로 멤버변수에 값을 할당하는 경우에는 체이닝을 이용해도 좋을 것 같기도 하구요.  간단한 예제입니다. ( http://codepad.org/Tsqig92W 에 가시면 실행 모습을 확인할 수 있습니다.)


<?
class MethodChaining {


    var $data = array();


    function __call($name, $args)
    {
        
        $prefix = strtolower(substr($name, 0, 3));
        $postfix = strtolower(substr($name, 3, strlen($name)));
        
        switch($prefix)
        {
            
            case ‘get’:
            
                return isset($this->data[$postfix]) ? $this->data[$postfix] : false;
            
            break;
            case ‘set’:
            
                if(!empty($args))
                    $this->data[$postfix] = count($args) == 1 ? $args[0] : $args;


                return $this;
                
            break;
            
        }
        
    }


}


$chain = new MethodChaining;


echo $chain->setInteger(1)->getInteger(); // 1
echo $chain->setString(‘hello, world’)->getString(); // hello, world
?> 
 

위지윅(wysiwyg) 에디터

공개 위지윅 에디터 수배중..

일단 제일 마음에 든것.
http://www.fckeditor.net/download


파일업로드 기능, 표 구현 및 수정, 한글 지원 여부가 가장 큰 관건이었는데
공개 에디터중 위 세가지 기능을 만족하는 것은 아직까지는 FCKeditor 밖에 없는 것 같다.
몇몇 유명 에디터들을 찾아봤는데 표기능이 좀 약하거나 파일업로드는 따로 만들어야 하거나
한글화를 따로 해야하는 번거로움이 있었다.
헉.. 라이선스가 올해 3월에 업데이트된 웹에디터 비교문서(http://www.geniisoft.com/showcase.nsf/WebEditors) 에서는 LGPL이었는데
그 이후에 Commercial로 바뀐것 같네요.
위 문서가 2008년 3월 22일 마지막으로 업데이트된 문서인데 각 에디터의 기능과 지원 브라우저를
잘 정리해놨네요.




그리고 팁 한개.






[팁] 초간단 위지윅 에디터 만들기 



자바스크립트 한줄만으로도 위지윅 에디터를 만들 수 있다면 믿으시겠습니까.

IE에서는 document.body.contentEditable 속성을 true로,
타 브라우저에선 document.designMode 속성을 on으로 해주면
페이지는 마술같게도 그 즉시 위지윅모드로 바뀌게 됩니다.

뭔 말인지 잘 모르시겠다구요?

백문이 불여일견이라고, 아래의 스크립트를 HTML에 넣어보시기 바랍니다.

 // ie에서는 contentEditable의 값을 true로 세팅해주면 위지윅 에디터 모드로 변경된다.
 // 그 외 브라우저에서는 iframe의 designMode의 값을 on으로 세팅해주면 된다.
[code]
 window.onload = function() {
  if (document.body && document.body.contentEditable != undefined && window.ActiveXObject) {
   document.body.contentEditable = “true”;
  } else {
   document.designMode = “on”;
  }
 }
 [/code]



[펌] 마우스 제스처 – js





[스크립트] [JS] Mouse Gesture






















글쓴이   Seeker 날 짜 08-10-30 21:25 조 회 823
Link1   http://www.seeker.kr/test/mouse_gesture.html (258)






마우스 제스처, 즉 마우스의 이동으로 지정한 동작을 실행하는 기능입니다.

FF는 이 기능을 사용할 수 있는 부가기능이 몇개 있고, 아예 제스처 기능이 기본으로 내장된 브라우저도 있지만 IE는 전혀 상관없기 때문에…

단축키 기능을 만들고 난 뒤 문득 이것도 있으면 편리하겠다 싶어서 만들어 봤습니다.


_gestures 에 동작과 함수를 지정하면 됩니다.


링크된 페이지에서 간단한 동작을 확인할 수 있습니다.


# 동작 : U(up) / D(down) / R(right) / L(left) 의 4가지 방향으로 구성

# 단계 제한은 없음. (하지만 많아도 3단계 이하로 지정하는게 사용에 편리)

# 20픽셀 이상의 동작만 인식 (인식 길이 조정 가능)

# 방향 구분은 60도, 즉 수직에서 좌우 30도(합 60도) 이내의 범위를 지나면 U 혹은 D이고 수평에서 상하 30도 이내의 범위를 지나면 R 혹은 L 판정 (범위 조정 가능)


# IE6/7, FF3, 크롬에서 테스트했습니다.




/*
이 스크립트에 대한 모든 권리는 제작자에게 있습니다.
스크립트를 이용하려면 제작자를 반드시 표기해야 합니다.

제작자 : Seeker
제작자 홈페이지 :
http://www.seeker.kr/
*/

// 이벤트 부여 함수
function addEvent(target,e,f) {
    if(window.addEventListener)
        target.addEventListener(e,f,false);
    else if(window.attachEvent)
        target.attachEvent(“on”+e,f);
    else
        target[“on”+e] = f;
}

function removeEvent(target,e,f) {
    if(window.removeEventListener)
        target.removeEventListener(e,f,false);
    else if(window.detachEvent)
        target.detachEvent(“on”+e,f);
    else
        target[“on”+e] = null;
}


// 액션 리스트
var _gestures = {
    U : [“스크롤 UP”,function() {document.documentElement.scrollTop -= document.documentElement.clientHeight;}],
    D : [“스크롤 DOWN”,function() {document.documentElement.scrollTop += document.documentElement.clientHeight;}],
    LU : [“페이지 상단”,function() {document.documentElement.scrollTop = 0;}],
    LD : [“페이지 하단”,function() {document.documentElement.scrollTop = document.documentElement.scrollHeight;}],

    R : [“앞으로”,function() {history.forward();}],
    L : [“뒤로”,function() {history.back();}],

    DR : [“새 창(탭) 열기”,function() {window.open(‘about:blank’);}],
    DL : [“창(탭) 닫기”,function() {window.close();}],

    DU : [“창(탭) 복사”,function() {window.open(location.href);}],
    UD : [“새로 고침”,function() {location.reload();}]
}

// 사용 전역변수 선언
var _g_pX,_g_pY,_g_tX,_g_tY;
var _g_path = “”;
var _g_target;
var _g_t_dir = “”;

// 마우스 다운시
function _g_down(e) {
    var e = e || event;
    _g_path = “”;
    _g_target = e.target || e.srcElement;

    if(e.button == 2) {
        _g_pX = _g_tX = e.clientX;
        _g_pY = _g_tY = e.clientY;
        addEvent(document,”mousemove”,_g_move);
        addEvent(document,”mouseup”,_g_up);
    } else {
        removeEvent(document,”mousemove”,_g_move);
        removeEvent(document,”mouseup”,_g_up);
    }
}

// 마우스 업시
function _g_up(e) {
    if(e.button == 2) {
        if(_g_path in _gestures) _gestures[_g_path][1]();
        removeEvent(document,”mousemove”,_g_move);
        removeEvent(document,”mouseup”,_g_up);
    }
}

// 컨텍스트 메뉴 방지용 리턴 막는 함수
function _g_false(e) {
    if(_g_path) {
        var e = e || event;
        if(e.preventDefault) e.preventDefault();
        if(“returnValue” in e) e.returnValue = false;
        return false;
    }
}

addEvent(document,”contextmenu”,_g_false);

// 마우스 이동시
function _g_move(e) {
    var e = e || event;
    var x = e.clientX;
    var y = e.clientY;
    var mX = x – _g_pX;
    var mY = _g_pY – y;
    var dir;

    if(mX == 0) {
        if(mY > 0) dir = “U”;
        else if(mY < 0) dir = “D”;
        else return;
    } else {
        var slope = mY/mX;
        if(slope > 2 || slope < -2) {
            if(mY > 0) dir = “U”;
            else dir = “D”;
        } else if(slope < 0.5 && slope > -0.5) {
            if(mX > 0) dir = “R”;
            else dir = “L”;
        }
    }

    if(dir && dir != _g_path.charAt(_g_path.length-1)) {
        if(_g_t_dir != dir) {
            _g_tX = _g_pX;
            _g_tY = _g_pY;
        }
        if(Math.abs(x-_g_tX) > 20 || Math.abs(_g_tY-y) > 20) {
            _g_path += dir;
        }
    }
    _g_t_dir = dir;
    _g_pX = x;
    _g_pY = y;

    window.status = _g_path + ((_g_path in _gestures)?(” : ” + _gestures[_g_path][0]):””);
}

addEvent(document,”mousedown”,_g_down);

[펌] 동적 테이블 추가, 삭제

출처 http://june44.com/board/blog/43
[code]







추가













[/code]