강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

php 파일 업, 다운로드
작성자 : 13 김영철
등록날짜 : 2009.01.13 12:44
1,461
1. 업로드
  ●업로드된 파일은 microtime 함수로 파일이름을 바꾼다
     참고 : ⓐ 스크립트가 실행될 염려가 없다.
            ⓑ <img src="0.1234545345"> 같이 확장자가 꼭 gif, jpg가 아니더라도 이미지가
               이미지가 보이므로 이미지파일을 꼭 예외로 할필요는 없다.
  ●is_uploaded_file()과  move_uploaded_file()을 사용한다.
     참고 : ⓐ php매뉴얼에 사용된 함수들이다.
            ⓑ move_uploaded_file()은 파일을 이동시키는 명령어이기때문에 파일을 카피하고
               임시파일을 지우는 명령보다 비용이 싸다.

2. 다운로드
  ●파일이름을 원상복구 시켜서 다운로드 시킨다. (원본파일이름은 디비에 저장되어있다)
  ●download.php 파일을 만들어 파일을 다운로드 시켜준다.
     참고 : ⓐ <a href=download.php?file_name=파일이름>파일받기</a> 이런형태로 다운로드 링크가 된다.
            ⓑ 단 위의 방법에는 한가지 문제점이 있다. 주소창에 [download.php?file_name=../db/config.php]
               이런식으로 직접 쓰는경우에 보안에 중요한 파일이 유출될수 있다.              
            ⓒ 이를 해결하기 위해 "파일이름"이 정해준 디렉토리 안의 파일인지 검사하게 한다.
               (단순히 파일이름에 ".." 또는 "/"또는 "\"가 들어가지 못하게 하면된다)


3. 다운로드 링크는...
<a href="download.php?file_name=진짜파일이름&file_micro=마이크로타임으로변환된이름">다운로드</a>
이렇게 해주시면 됩니다.


downloadn.php 파일
<?
require_once "lib.php";

// 접근경로 확인
if (!eregi($_SERVER['HTTP_HOST'], $_SERVER['HTTP_REFERER'])) Error("외부에서는 다운로드 받으실수 없습니다.");


// 다운로드 방식을 구한다.
$ext = array_pop(explode(".", $_GET['file_name']));

if ($ext=="avi" || $ext=="asf")         $file_type = "video/x-msvideo";
else if ($ext=="mpg" || $ext=="mpeg")   $file_type = "video/mpeg";
else if ($ext=="jpg" || $ext=="jpeg")   $file_type = "image/jpeg";
else if ($ext=="gif")                   $file_type = "image/gif";
else if ($ext=="png")                   $file_type = "image/png";
else if ($ext=="txt")                   $file_type = "text/plain";
else if ($ext=="zip")                   $file_type = "application/x-zip-compressed";

// 실제로 다운로드 받는다.
$ret = download_file( $_GET['file_name'], $_GET['file_micro'], "여기에 파일이 있는 디렉토리를 쓴다.", $file_type);

if( $ret == 1 ) Error("지정하신 파일이 없습니다.");
if( $ret == 2 ) Error("접근불가능 파일입니다. 정상 접근 하시기 바랍니다.");
?>
  

lib.php 파일
<?
//=========================================================================================
//  파일 업로드 함수
//
//  파라미터
//    $upload_dir     : 업로드 드렉토리
//    $tmp_file       : 서버로 업로드된 임시 파일
//    $file_name_plus : 관리를 위해 파일앞에 붙여주는 문자열
//
//  리턴값
//    파일저장에 성공햇을겨우 바꾸어진 파일 이름을 넘긴다.
//    실패할경우 널문자를 넘긴다.
//=========================================================================================
function upload_file($upload_dir, $tmp_file, $file_name_plus="" )
{
        // 파일이름을 시간으로 바꿔서 php등으 스크립트 언어가 실행되지 못하게한다.
        $new_file_name = microtime();


        // 파일이름이 겹친다면 (마이크로 타임으로 바꾸었기 때문에 이럴일은 거의 없다.)
        // 파일 확장자 전에 '_i' 를  붙인다. (i는 임의의숫자)
        $old_new_file_name = $new_file_name;
        for( $i=0; file_exists( $upload_dir.$new_file_name ); $i++ )
                $new_file_name = $old_new_file_name."_".$i;


        // 관리를 쉽게하기위해 file_name_plus를 앞에 달아준다.
        $new_file_name = $file_name_plus.$new_file_name;

        //빈칸을 없앤다.
       $new_file_name = str_replace(" ","_", $new_file_name);

        // 임시디렉토리에서 지정디렉토리로 파일을 옴긴다.
        if( is_uploaded_file( $tmp_file ) )
                move_uploaded_file( $tmp_file, $upload_dir.$new_file_name );
        else return "";

        return $new_file_name;
}


//=========================================================================================
//  이름 바꿔 다운로드하기
//
//  파라미터
//    $file_name  : 실제파일이름
//    $file_dir   : 파일의 위치
//    $file_micro : 바뀐 파일 이름명
//    $file_type  : 파일의 다운로드 방식, 비워두면 일반 파일이다.
//                                    - 동영상  : video/mpeg, video/x-msvideo
//                                    - 이미지  : image/jpeg, image/gif, image/png
//                                    - Zip파일 : application/x-zip-compressed
//                                    - txt파일 : text/plain
//  리턴값
//          완료했을 경우 0을 리턴한다.
//          다운로드 파일이 없으면 요청시 1을 리턴한다.
//          해킹시도등 잘못된 파일 요청시 2을 리턴한다.
//=========================================================================================
function download_file($file_name, $file_micro, $file_dir, $file_type )
{
        // 읽어올 파일명에 이상이있는지 검사한다.
        if( !$file_name || !$file_micro || !$file_dir ) return 1;
        if( eregi( "\\\\|\.\.|/", $file_micro ) ) return 2;


        if( file_exists($file_dir.$file_micro) )
        {
                $fp = fopen($file_dir.$file_micro,"r");

                if( $file_type )
                {
                        header("Content-type: $file_type");
                        Header("Content-Length: ".filesize($file_dir.$file_micro));    
                        Header("Content-Disposition: attachment; filename=$file_name");  
                        Header("Content-Transfer-Encoding: binary");
                        header("Expires: 0");
                }
                else
                {
                        if(eregi("(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)", $HTTP_USER_AGENT))
                        {
                                Header("Content-type: application/octet-stream");
                                Header("Content-Length: ".filesize($file_dir.$file_micro));    
                                Header("Content-Disposition: attachment; filename=$file_name");  
                                Header("Content-Transfer-Encoding: binary");  
                                Header("Expires: 0");  
                        }
                        else
                        {
                                Header("Content-type: file/unknown");    
                                Header("Content-Length: ".filesize($file_dir.$file_micro));
                                Header("Content-Disposition: attachment; filename=$file_name");
                                Header("Content-Description: PHP3 Generated Data");
                                Header("Expires: 0");
                        }
                }


                fpassthru($fp);
                fclose($fp);
        }
        else return 1;
}

//=========================================================================================
//  파일 삭제하기
//
//  파라미터
//    $file_name  : 실제파일이름
//    $file_dir   : 파일의 위치
//
//  리턴값
//          완료했을 경우 0을 리턴한다.
//          삭제할 파일이 없으면 요청시 1을 리턴한다.
//          해킹시도등 잘못된 파일 요청시 2을 리턴한다.
//    파일이 존재하지만 지울수 없는겨우 3을 리턴한다.
//=========================================================================================
function delete_file($file_name, $file_dir )
{
        // 읽어올 파일명에 이상이있는지 검사한다.
        if( !$file_name || !$file_dir ) return 1;
        if( eregi( "\\\\|\.\.|/", $file_name ) ) return 2;

        // 파일이 있나 검사.
        if( !file_exists($file_dir.$file_micro) ) return 1;

        // 있는데 못지웠을 경우
        if( !unlink() ) return 3;

        return 0;
}
?> 

[출처] 웹디황용

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
3135 MSSQL DBA GUIDE - 테이블 관리 13 김영철 01.23 1462
3134 소스보호 99 단국강토 02.05 1464
3133 데이터베이스의 저장 프로시저를 자동으로 생성 M 최고의하루 12.24 1466
3132 점점커지는 액션 99 단국강토 01.13 1469
3131 웹문서 검색엔진 기술의 핵심 II - Indexing 방법론 13 김영철 01.13 1469
3130 주화면의 최신글을 preload로 빠르게 13 김영철 01.13 1469
3129 pcre 문법, preg | 13 김영철 01.13 1470
3128 MySQL 최적화 및 튜닝 13 김영철 01.23 1478
3127 다중그림 파일업로드 99 단국강토 02.05 1482
3126 배열 검색 13 김영철 01.14 1482
3125 자바 스크립트 정리 99 단국강토 02.16 1483
3124 플래시로 3차원 환영은 어떻게 그리나? (1) 99 단국강토 02.09 1483
3123 removeNodes,searchUpByTagName M 최고의하루 01.15 1484
3122 startDrag() 로 무비클립 이동 99 단국강토 01.29 1484
3121 $PHP_SELF .... $REQUEST_URI 13 김영철 01.13 1484
3120 Smarty QuickStart Guide 13 김영철 01.14 1484
3119 class.layout을 사용한 동적인 웹페이지 13 김영철 01.13 1485
3118 플래시에서 입력된 주민번호 오류 체크하는 방법 M 최고의하루 02.04 1486
3117 윈도우에서 PHP5와 apache2 연동 13 김영철 01.14 1488
3116 Danamic Text / embed 99 단국강토 02.03 1489
3115 워터마크 13 김영철 01.15 1489
3114 자바스크립트 활용도 높은 소스 Tip 모음 99 단국강토 02.16 1490
3113 파일사이즈 함수 13 김영철 01.13 1495
3112 도는 10개의 샘플들 99 단국강토 02.09 1496
3111 ID attribute selector 99 단국강토 02.09 1497
3110 [php] 정규식 13 김영철 01.13 1497
3109 PHP RSS Reader [RSS 2.0] 13 김영철 01.14 1500
3108 window.open 옵션 13 김영철 01.14 1500
3107 자바 스크립트 정리 99 단국강토 02.16 1502
3106 문자열 처리하기 99 단국강토 01.16 1503
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취