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

php 파일 업, 다운로드
작성자 : 13 김영철
등록날짜 : 2009.01.13 12:44
1,231
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

번호 제목 글쓴이 날짜 조회
3285 URL Cache를 사용하여 웹을 더욱 빠르게 13 김영철 01.13 979
3284 php5 99 단국강토 01.02 1054
3283 php 세션css 99 단국강토 12.30 1065
3282 [hatelove님의 JBBS 알고리즘 강좌 9] 13 김영철 01.14 1069
3281 reset , foreach 13 김영철 01.13 1105
3280 png 99 단국강토 12.30 1120
3279 플래시로 만든 php 함수 사전 13 김영철 01.13 1162
3278 PHP강좌】PHP URL함수 13 김영철 01.13 1166
3277 foreach 와 배열 13 김영철 01.14 1172
3276 주화면의 최신글을 preload로 빠르게 13 김영철 01.13 1183
3275 [php] 내장함수 13 김영철 01.13 1188
3274 태그 허용 함수???? 이제 개념을 바꾸자 13 김영철 01.14 1205
3273 플래쉬 Panels 에 대한 기본개념들 99 단국강토 01.06 1212
3272 foreach 13 김영철 01.13 1213
3271 파일관련함수 13 김영철 01.13 1213
3270 [hatelove님의 JBBS 알고리즘 강좌 7] 13 김영철 01.14 1215
3269 PHP도 객체지향형 프로그램이다..!!(클래스,상속동...) 13 김영철 01.13 1215
3268 PHP입문 - 함수 13 김영철 01.13 1215
3267 플래시에서 pc cam 영상보여주기 99 단국강토 02.16 1218
3266 php기본함수 정리!! 13 김영철 01.13 1219
3265 시스템콜인 open 계열 함수와 스트림기반의 fopen 계열.. 13 김영철 01.13 1221
3264 소스를 간편하게 만들어 주는 with문 99 단국강토 02.10 1224
3263 객체 정의하기[이론,예제] 99 단국강토 01.29 1229
열람중 php 파일 업, 다운로드 13 김영철 01.13 1232
3261 역인덱스 게시판 | 13 김영철 01.14 1241
3260 파일업로드 썸네일 제작 class 13 김영철 01.13 1244
3259 초보자용 이것저것 몇가지 팁 13 김영철 01.14 1246
3258 간단 날짜계산 99 단국강토 02.16 1248
3257 window 객체 M 최고의하루 12.20 1249
3256 디렉토리 폴더 모든파일 표시 [php] 13 김영철 01.14 1250
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취