PHP에는 자체 FTP 함수가 있습니다. 여기서는 FTP 함수를 이용하지 않고 오직 CURL 만을 이용해 FTP 를 관리해 보겠습니다.


CURL에는 많은 기능이 있습니다. 자주 사용하는 몇가지를 소개합니다.


1. 파일을 업로드하는 방법.

// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 업로드할 파일 
$realfile $_FILES['uerfile']['tmp_name']; 

$ch curl_init(); 
curl_setopt($chCURLOPT_UPLOAD1); 
curl_setopt($chCURLOPT_INFILE, @fopen($realfile'r')); 
curl_setopt($chCURLOPT_INFILESIZE, @filesize($realfile)); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


2. 파일을 다운로드 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 다운로드할 파일 
$realfile = 'example.gif';


$remote tempnam(sys_get_temp_dir(), 'CURL_FTP'); 

$ch curl_init(); 
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue); 
curl_setopt($chCURLOPT_FILE$fp = @fopen($remote'w+')); 

curl_setopt($chCURLOPT_URL$realserver . $realfile); 

curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 

// URL 경로 
$url $remote


3. 파일을 삭제하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 삭제할 파일 
$list = array(
 'DELE habony.gif''DELE namefile.bmp''DELE example.jpg'
); 

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE$list); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 


4. 파일의 이름을 변경.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 현재 파일 
$old 'old.bmp'
// 새로운 이름 
$new 'new.bmp'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("RNFR " $old"RNTO " $new); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 


5. 폴더를 삭제하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 삭제할 폴더 
$rmdir 'dirname'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("RMD " $rmdir); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


6. 폴더를 만드는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 생성할 폴더 
$mkdir 'dirname'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("MKD " $mkdir); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


7. 권한을 설정하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 설정할 폴더/파일 
$fname 'data'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("SITE CHMOD 0707 " $fname); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


8. 파일 목록을 출력하는 방법.


 // 서버 경로
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'


$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
$list curl_exec($ch); 
curl_close($ch); 

print_r($list); 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

bool ftp_site ( resource $ftp_stream , string $command ) (PHP 4, PHP 5)

이 함수는 주로 파일권한 변경에 사용됩니다.

예쩨(ex #1
 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다. 


 
// 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);  

 

 // 서버의 파일(또는 폴더)의 퍼미션을 변경합니다.
 if (ftp_site($conn_id'CHMOD 0600 /home/user/privatefile')) {
   echo 
"정상적으로 처리되었습니다.\n";
 } else {
   die('처리에 문제가 발생되었습니다.');
 }

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag ftp

댓글을 달아 주세요

다음은 파일이름을 변경하는 예제이며, 원격을 지원합니다.

 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며, 
 // 보통 public_html, www, html 로 시작합니다. 

 // 호스트 정보 
 
$ftp_server "호스트 혹은 ip주소"
;  
 
$ftp_user_name "접속 아이디"
;  
 
$ftp_user_pass "접속 패스워드"
;  

 
// 호스트 접속 
 
$conn_id ftp_connect($ftp_server
);  

 
// 호스트 로그인  
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);  

 
$old_file 'somefile.txt.bak'

 
$new_file 'somefile.txt'

 if (
ftp_rename($conn_id$old_file$new_file
)) {  
  echo 
"successfully renamed $old_file to $new_file\n"

 } else {  
  echo 
"There was a problem while renaming $old_file to $new_file\n"

 } 


 
ftp_close($conn_id
); 
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

ftp기능은 파일관련 함수와 비슷하지만 큰 차이가 있는데, 사용에 제한이 없다는 점입니다. 주의점은 어떤 작업요청시 항상 로그인정보 작성이 필요하다는 점입니다.

예제(ex #1

  <?php
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.

 // 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 


 
// 퍼미션 변경할 파일
 
$file 'public_html/test.php'
;

 
// 해당파일을 0644로 변경합니다.
 
if (ftp_chmod($conn_id0644$file) !== false
) {
      echo 
"$file chmoded successfully to 644\n"
;
 } else {
      echo 
"could not chmod $file\n"
;
 }

 
ftp_close($conn_id
);
 
?> 


다음 함수로 변경이 가능하나 보안상 자주 사용되는 것을 권하지 않습니다.

예제(ex #2

  <?php
 
// 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 퍼미션 변경할 파일
 
$file 'public_html/test.php'
;

 if (
ftp_site($conn_id'CHMOD 0600 ' $file
)) {
   echo 
"Command executed successfully.\n"
;
 } else {
   die(
'Command failed.'
);
 }
 
?>


예제(ex #3

  <?php
 
// 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 퍼미션 변경할 파일
 
$file 'public_html/test.php'
;

 
$command 'chmod 0600 ' $file
;
 if (
ftp_exec($conn_id$command
)) {
    echo 
"$command executed successfully\n"
;
 } else {
    echo 
"could not execute $command\n"
;
 }

 
ftp_close($conn_id
);
 
?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이 기능은 업,다운로드 중 다른 작업을 가능하게 해주는 진보된 기능입니다. 사용 방법은 이전 함수와 크게 다르지 않으니 어렵지 않습니다.

다음은 B 호스트에서 로컬로 다운로드합니다.

예재(ex #1

  <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에서 자료를 가져 온다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 원격으로 B 호스트에서 다운로드합니다.
 // 로컬에 저장할 파일명, 필요시 경로도 같이 작성해 줍니다. 
 
$file 'test_body.php'

 
$fp fopen($file'w'
); 

 
// 원격으로 public_html/userid/test.php 파일을 가져옵니다.
 
$ret ftp_nb_fget($conn_id$fp'public_html/userid/test.php'FTP_BINARY
); 
 
$i 1
;
 while (
$ret == FTP_MOREDATA
) { 

   
// 다운로드중 다른 작업을 작성합니다.
   
echo "${i} \n"
;
   
$i
++;
   
$ret ftp_nb_continue($conn_id
); 
 } 
 if (
$ret != FTP_FINISHED
) { 
      echo 
"다운로드 중 에러가 발생하였습니다."

      exit(
1
); 
 } 
 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


다음은 로컬파일을 B 호스트로 업로드합니다.

예제(ex #2

  <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 원격으로 전송할 파일
 // 필요시 사용자 업로드 파일을 B 호스트로 전송시
 // $_FILES['userfile']['tmp_name'] 으로 작성하면 됩니다.
 
$file 'test.php'

 
$fp fopen($file'r'
); 

 
// 원격으로 public_html/userid/test.php 파일 이름으로 저장합니다.
 
$ret ftp_nb_fput($conn_id'public_html/userid/test.php'$fpFTP_BINARY
); 
 
$i 1
;
 while (
$ret == FTP_MOREDATA
) { 

   
// 업로드중 다른 작업을 작성합니다.
   
echo "${i} \n"
;
   
$i
++;
   
$ret ftp_nb_continue($conn_id
); 
 } 
 if (
$ret != FTP_FINISHED
) { 
      echo 
"업로드중 에러가 발생하였습니다."

      exit(
1
); 
 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


다음은 원격 업로드 이어전송하기 및 프로그레스 입니다.

예제(ex #3

  <?php
 ob_end_flush
();
 
$remote_file 'remote.txt'
;
 
$local_file 'local.txt'
;

 
$fp fopen($local_file'r'
);

 
$conn_id ftp_connect($ftp_server
);
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
$ret ftp_nb_fput($conn_id$remote_file$fpFTP_BINARY
);
 while (
$ret == FTP_MOREDATA
) {
     
// 업로드 중 리소스 소멸시 재연결합니다.
     
if(!isset($conn_id2
)) {
         
$conn_id2 ftp_connect($ftp_server
);
         
$login_result2 ftp_login($conn_id2$ftp_user_name$ftp_user_pass
);
      }
        
      
// 전송된 파일 크기를 측정합니다.
      
if(isset($conn_id2
)) {
          
clearstatcache
();
          
$remote_file_size ftp_size($conn_id2$remote_file
);
      }

      
// 프로그레스
      
$local_file_size  filesize($local_file
);
      if (isset(
$remote_file_size) && $remote_file_size 
){
          
$i = ($remote_file_size/$local_file_size)*100
;
          
printf("%d%% uploaded<br />\n"$i
);
          
flush
();
      }  
       
$ret ftp_nb_continue($conn_id
);
 }

 if (
$ret != FTP_FINISHED
) {
     print(
"There was an error uploading the file...<br />\n"
);
     exit(
1
);
 }
 else {
     print(
"ok!<br />\n"
);
 }

 
ftp_close($conn_id
); 

 
fclose($fp
);
 
?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php ftp에는 다양한 기능을 제공합니다. 그중 서버로 전송된 데이터를 다른 서버, 혹은 호스팅을 사용중이라도 ftp기능을 지원한다면, 두 서버간에 데이터 공유가 가능합니다. 다시 말해 웹사이트는 A 호스트로 운영을 하고, 데이터(파일 서버)는 B 호스트에 보관하는데, 사용자 요청시만 A 호스트로 업로드하거나 다운로드합니다.

가능하다면 골드회원은 C 호스트 파일다운로드권한을 주고, 실버회원은 B 호스트 파일다운로드권한 부여를 해서 파일 관리도 가능할 지도 모릅니다.

다음은 사용자가 업로드한 파일을 B 호스트로 원격 업로드합니다.

예재(ex #1

 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // 디비에 저장될 파일 이름 
 
$filename $_FILES['userfile']['name'
];
 
// B 호스트에 저장될 실제 파일
 
$tmpfile md5("habony_" $_FILES['userfile']['tmp_name'
]); 
 
$fp fopen($tmpfile'r'
); 

 
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
); 

 
// 업로드 파일을 원격으로 B 호스트로 이동
 // B 호스트에 저장되면 DB 에 파일정보를 업데이트해줌
 // ftp_put 은 로컬에서만 가능하므로 ftp_fput을 사용합니다.
 
if (ftp_fput($conn_id$tmpfile$fpFTP_BINARY
)) { 
    echo 
"Successfully uploaded $filename\n"
;
 } else { 
    echo 
"There was a problem while uploading $file\n"

 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?>


필요시 업로드한 파일을 A 호스트로 가져 오는데, 이는 사용자가 파일 다운로드요청이나 이미지출력요청을 하였을 때만 처리되는 부분입니다.

예제(ex #2

 <?php 
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.

 // B 호스트에서 가져올 실제 파일
 
$remote_file "가져올 파일"
;
 
// A 호스트로 저장하거나 브라우저로 출력해야 할 파일
 
$local_file "저장할 파일"
;

 
// 임시 파일을 엽니다.
 
$fp fopen($local_file'w+'
);

  
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
// 파일을 A 호스트로 업로드하고, 
 // $file 로 다운로드하거나 저장할 코드를 작성하면 됩니다.
 // ftp_get 은 로컬에서만 가능하므로 ftp_fget을 사용합니다.
 
if (ftp_fget($conn_id$fp$remote_fileFTP_BINARY0
)) { 
    while(!
feof($fp
)){ 
         
$file .= fread($fp1024
); 
    }
    
// 파일 다운로드나 파일 출력 처리 부분입니다.
    
echo "Successfully written to $local_file\n"

 } else { 
    echo 
"There was a problem while downloading $remote_file 
            to $local_file\n"

 } 

 
ftp_close($conn_id
); 
 
fclose($fp
); 
 
?> 


사용자가 자료 삭제 요청하였을 때, B 호스트 파일 삭제 처리 부분입니다.

예제(ex #3

<?php
 
// ftp는 상대경로, 절대경로가 허용되지 않으며,
 // 보통 public_html, www, html 로 시작합니다.
 // public_html/userid 에 자료를 저장한다면,
 // ftp 경로는 "public_html/userid/파일" 이 됩니다.
 
$file 'public_html/test.php'
;

   
// B 호스트 정보
 
$ftp_server "호스트 혹은 ip주소"

 
$ftp_user_name "접속 아이디"

 
$ftp_user_pass "접속 패스워드"


 
// B 호스트 접속
 
$conn_id ftp_connect($ftp_server
); 

 
// B 호스트 로그인 
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass
);

 
// B 호스트 파일 삭제
 // 파일 삭제가 정상적이면 DB 에 저장된 데이터도
 // 삭제 되도록 코드를 작성하면 됩니다.
 
if (ftp_delete($conn_id$file
)) {
      echo 
"$file deleted successful\n"
;
 } else {
      echo 
"could not delete $file\n"
;
 }

 
ftp_close($conn_id
);
 
?> 


이러한 기능은 서버일 경우 문제되지 않으나 호스팅을 받는 입장이라면 제한이 될 수 있습니다. 그래서 다음 코드로 ftp 지원여부 확인이 가능합니다.

 <?php
 
if(!function_exists('ftp_login'
)){
      echo 
"ftp 지원이 안됩니다."
;
 }
 
?>

 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

  • rootman 2019.04.05 21:36  댓글주소  수정/삭제  댓글쓰기

    글 읽고서 궁금한게 있어서 남깁니다.
    CI 프레임워크 사용중이고 php입니다.
    저 소스 적용하는 곳이 정확히 어느 곳인지 알 수 있을까요?

    • Favicon of https://blog.habonyphp.com BlogIcon 하보니 2019.04.08 11:42 신고  댓글주소  수정/삭제

      CodeIgniter 를 말씀하시는 것 같은데, 죄송하지만 CodeIgniter 는 잘 모릅니다.
      다만...
      일반적인 방법으로 설명드리자면...
      위 소스가 proc.php 로 저장되어 있다면...

      <form enctype="multipart/form-data" action="proc.php" method="post">
      <input type="file" name="userfile">
      <input type="submit" value="전송">
      </form>

      정도가 되지 않을까 싶습니다.

재수정일: 5월 25일 pm 7:22에 윈도우호환성문제로 파일이 재수정되었습니다.

이제 목록을 만들어 보도록 하겠습니다.

 

 


디렉토리함수에 대해 이해하고 있다면, FTP 제작은 그리 어렵지 않을 것이라 생각됩니다. 펑션 파일은 로그인처리시 사용된 동일한 소스입니다. 앞으로 자주 사용되므로 함수로 만들도록 합니다.

함수 만들기 -- func.php

 <?php
 
// php ftp 연결 
 
function ftp_conn
(){
      
$data 
= array();
      
$data['time'] = 90
;
      
$data['host'] = base64_decode($_SESSION['ftp_host'
]);
      
$data['id']   = base64_decode($_SESSION['ftp_id'
]);
      
$data['pass'] = base64_decode($_SESSION['ftp_pass'
]);
      
$data['port'] = base64_decode($_SESSION['ftp_port'
]);
      
$data['pasv'] = base64_decode($_SESSION['ftp_pasv'
]);
      
$data['ssl']  = base64_decode($_SESSION['ftp_ssl'
]);

      
$ftp_conn false
;
      if (
$data['ssl'] === "y"
) {
            if(
false === ($ftp_conn = @ftp_ssl_connect($data['host'],
$data['port'], $data['time'
]))){
                  exit(
"보안 접속이 정상적이지 않습니다."
);
            }
      } else if (
false === ($ftp_conn = @ftp_connect($data['host'],
$data['port'], $data['time'
]))) {
            exit(
" 접속이 정상적이지 않습니다."
);
      }

      
// FTP 로그인 테스트
      
$ftp_id false
;
      if(
false === ($ftp_id = @ftp_login($ftp_conn,$data['id'],
$data['pass'
]))) {
            exit(
"FTP 로그인에 실패하였습니다."
);
      }
      
// Passive 접속여부
      
if($data['pasv'
]){
            @
ftp_pasv($ftp_conntrue
);
      }

      if(
is_resource($ftp_conn
)){
            return array(
$ftp_conn$data['host'
]);
      } else {
            return 
null
;
      }
 }

 function 
attach($size
) {
      
$sizes = array(" B"" KB"" MB"" GB"" TB"" PB"
" EB"" ZB"" YB"
);
      if (
$size == 0) { return('n/a'
); } else {
      return (
round($size/pow(1024, ($i floor(log($size1024)))),
 
2) . $sizes[$i
]); }
 }
 
?> 


목록 만들기 -- list.php

 <?php
 $data 
= array();
 
$data = &$_GET
;
 unset(
$_GET
);

 
session_start
();
 include (
"func.php"
);

 if(
null === (list($ftp$host) = ftp_conn
())){
      exit(
"리소스 확보에 실패하였습니다."
);
 } else {
      
$local_server "접속호스트: " $host "<br />\n"
;
 }


 
// 루트 이동
 
if(!empty($data['dir'
])){
      
// 경로를 변경할 때 사용됩니다.
      // ftp_chdir($ftp 리소스, 변경할 경로)
      // 성공하면 true를, 실패하면 php오류를 표시하므로 @를 붙입니다.
      
if(false === @ftp_chdir($ftp,$data['dir'
])){
           exit(
"경로변경에 실패하였습니다."
);
      }
 }

 
// ftp_pwd($ftp 리소스)
 // 현제 경로를 반환합니다.
 // 성공하면 경로명을, 실패하면 false를 반환합니다.
 
$data['pwd'] = ftp_pwd($ftp
);
 
?>

<!DOCTYPE html>
<style>
 td { font-size:12pt; color: #666666 }
 a { font-size:12pt; color: #000000 }
</style>

<br />
<br />
<br />
<br />

<table>
 <tr>
  <td>
   <?php echo $local_server;
?>
</table>

<table>
 <tr>
  <td>
   <a href='list.php'>Home</a>&nbsp;
   
<?php
   
// 루트
   
$rtmp explode('/',$data['pwd'
]);
   
$rcount count($rtmp
);
   for(
$i=1$i<$rcount$i
++){
        if(
strlen($rtmp[$i]) > 1
){
             
$data['history'] .= "/".$rtmp[$i
];
             echo 
'> <a href=list.php?dir='.urlencode($data['history']).'>'.$rtmp[$i]."</a>&nbsp;"
;
        }
   }
   
?>
</table>

<table width="550">
 <tr height="1" bgcolor="#666666">
  <td colspan="5">
 <tr>
  <td>
   No
  <td>
   Name
  <td>
   Perms
  <td>
   Size
  <td>
   Time
 <tr height="1" bgcolor="#666666">
  <td colspan="5">
 
 
<?
 
// 배열 = ftp_rawlist($ftp 리소스, 경로)
 // 성공하면 아래 처럼 자세한 정보를 가져 옵니다. ftp특성상 원격지원이 가능합니다.
 // 물론 유닉스와 윈도우는 형식을 다르게 가져 옵니다.
 // 유닉스는 다음과 같이 정보를 가져 옵니다.
 // -rw-r--r-- 1 root root 1346 May 24 12:31 func.php
 // -rw-r--r-- 1 root root 1965 May 24 12:56 list.php 
 // 윈도우는 퍼미션이 없기 때문에 다음과 같은 정보를 가져 옵니다.
 // drwxrwxrwx 1 root root 0 May 08 13:43 Launcher
 // -rwxrwxrwx 1 root root 2388176 May 08 14:20 d3dx9_30.dll
 // 파일(또는 디렉토리)목록만 가져 오려면 ftp_nlist함수를 사용합니다.
 // 배열 = ftp_nlist($ftp 리소스, 경로);
 // func.php
 // list.php
 
$data['item'] = ftp_rawlist($ftp,$data['dir'
]);
 
$fcount count($data['item'
]);
 for(
$i=0$i<$fcount$i
++){

      
$item split("[ ]+",$data['item'][$i],9
);
      
// -rw-r--r-- 1 root root 1346 May 24 12:31 func.php
      // 공백으로 분할하였을 때...
      // $item[0] = -rw-r--r--; 퍼미션
      // $item[1] = 1;
      // $item[2] = root;
      // $item[3] = root;
      // $item[4] = 1346; 바이트
      // $item[5] = May;
      // $item[6] = 24;
      // $item[7] = 12:31;
      // $item[8] = func.php; 파일명

      // ftp용 유닉스 타임스탬프로 반환하는 ftp_mdtm함수
      // 이 함수는 윈도우에서는 동작하지 &#51066;습니다.
      // 그러므로 "$item[5]-$item[6]-$item[7]"로 조합해도 됩니다.
      // date("Y-m-d", ftp_mdtm($ftp리소스, 파일명))

 
if(($item[8] !== '.') && ($item[8] !== '..'
)) {

       
// $item[0] = -rw-r--r--; 퍼미션
       // 첫문자가 -이면 파일, d이면 폴더
       
$data['type']  = substr($item[0],0,1
);

       
$j $i+1
;

       
// 첫문자가 d,l 이면 폴더
       
if($data['type'] === 'd'
) {

  echo 
"
  <tr>
   <td>
    " 
$j 
"
   <td>
    <a href='list.php?dir=" 
$data['dir'] . "/" urlencode($item[8]) . "'>/" $item[8] . 
"</a>
   <td>
    " 
$item[0] . 
"
   <td>
    " 
attach($item[4]) . 
"
   <td>
  
  "
;
       }
       
// 파일 시작
       
if($data['type'] === '-'
) {
 
  echo 
"
  <TR>
   <TD>
    " 
$j 
"
   <TD>
    " 
$item[8] . 
"
   <TD>
    " 
$item[0] . 
"
   <TD>
    " 
attach($item[4]) . 
"
   <TD>
    " 
date("y-m-d H:i:s.",ftp_mdtm($ftp,$item[8])) . 

  "
;
       }
   }
 }

 
ftp_quit($ftp
);
 
?>

</table> 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag ftp

댓글을 달아 주세요

윈도우에서는 별다른 설정없이 바로 사용 가능하나, 유닉스계열에서는 --enable-ftp 설정옵션을 하여야 합니다. 일반적인 ftp기능을 php로 구현이 가능하며, 실제 운영시 정보공유나 파일 분산작업이 가능하여 많이 사용되는 기능입니다.

우선 로그인폼과 로그인처리를 만들어 보겠습니다.


로그인폼 제작 -- login.php
<!DOCTYPE html>
<style> td { font-size:12pt; color: #666666}</style>
<BR />
<BR />
<BR />
<BR />
<table>
<form action='login_ok.php' method='post'>
<input type='hidden' name='mode' value='login' />
 <tr>
  <td colSpan="2">&nbsp;하보니&nbsp;Log in ...
 <tr>
  <td colSpan="2">&nbsp;Connect to FTP Server
 <tr>
  <td>&nbsp;Server
  <td>
  <input type='text' name='inputhost' value='' />
 <tr>
  <td>&nbsp;User
  <td>
   <input type='text' name='inputid' />
 <tr>
  <td>
   &nbsp;Password
  <td>
   <input type='password' name='inputpass' />
 <tr>
  <td>&nbsp;Port
  <td>
   <input type='text' name='port' size='4' value='21' />
    &nbsp;<input type='checkbox' name='ssl' value='y' />SSL-ftp
    &nbsp;<input type='checkbox' name='pasv' value='y' />Passive Mode
 <tr>
  <td colSpan="2">
   <INPUT type="submit" value="Log on" />
</form>
</table> 

로그인 처리 제작 -- login_ok.php

 <?php
 
// ftp_login 함수가 있는지 체크합니다.
 // ftp 기능이 활성화되어 있지 않다면 오류를 표시합니다.
 
if(!function_exists('ftp_login'
)){
      exit(
"ftp 기능을 지원하지 않습니다."
);
 }

 
$data 
= array();
 
$data = &$_POST
;
 
$data['time'] = 90
// 서버 접속 시간, 기본 90초 
 
unset($_POST); 
// 변수의 변질을 막기위해 삭제를 합니다.


 // 아이디, 패스워드값이 비어 있으면 에러
 
if (empty($data['inputhost'
])) {
      exit(
"호스트가 비어 있습니다."
);
 }
 if (empty(
$data['inputid'
])) {
      exit(
"아이디가 비어 있습니다."
);
 }
 if (empty(
$data['inputpass'
])) {
      exit(
"패스워드가 비어 있습니다."
);
 }

 
// 접속 포트, 기본 21
 
if($data['port'] !== 21
){
      if(!
ereg("^[1-9][0-9]*$"$data['port'
])){
           exit(
"잘못된 포트입니다."
);
      }
 }

 
$ftp_conn false
;
 if (
$data['ssl'] === "y"
) {
      
// 보안접속시 실행
      // 리소스 = ftp_ssl_connect(접속 호스트, 접속포트, 서버 접속시간)
      
if(false === ($ftp_conn = @ftp_ssl_connect(
        $data
['inputhost'], $data['port'], $data['time'
]))){
           exit(
"보안 접속이 정상적이지 않습니다."
);
      }
 
// 일반 접속시 실행
 // 리소스 = ftp_connect(접속 호스트, 접속포트, 서버 접속시간)
 
} else if (false === ($ftp_conn = @ftp_connect(
          $data
['inputhost'], $data['port'], $data['time'
]))) {
      exit(
" 접속이 정상적이지 않습니다."
);
 }

 
// FTP 로그인 테스트
 
$ftp_login false
;
 
// ftp_login(리소스, 접속아이디, 접속패스워드)
 
if(false === ($ftp_login = @ftp_login(
   $ftp_conn
,$data['inputid'],$data['inputpass'
]))) {
      exit(
"FTP 로그인에 실패하였습니다."
);
 }


 
// 아이디, 패스워드 세션 생성
 
if($ftp_login === true
){
      
session_start
();

      
// 호스트, 아이디, 패스워드, 접속포트 저장
      
$_SESSION['ftp_host'] = base64_encode($data['inputhost'
]);
      
$_SESSION['ftp_id']   = base64_encode($data['inputid'
]);
      
$_SESSION['ftp_pass'] = base64_encode($data['inputpass'
]);
      
$_SESSION['ftp_port'] = base64_encode($data['port'
]);

      
// 보안 접속시 필요합니다.
      
$_SESSION['ftp_ssl'] = base64_encode($data['ssl'
]);
  
      
// bool ftp_pasv ( resource $ftp_stream , bool $pasv )
      // passive mode 접속시 필요합니다.
      
if($data['pasv'] === "y"
){
           
$_SESSION['ftp_pasv'] = base64_encode($data['pasv'
]);
      }
 }

 
// ftp 연결 종료
 
if(is_resource($ftp_conn
)){
      
ftp_close($ftp_conn
);
 }

 echo 
"<pre>"
;
 
print_r($_SESSION
);

 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag ftp

댓글을 달아 주세요