php
PHP - FTP 목록 만들기
로그인 폼을 만들었으니 이제 목록을 만들어 보도록 하겠습니다.
디렉토리 함수에 대해 이해하고 있다면, FTP 제작은 그리 어렵지 않을 것이라 생각됩니다. Function 파일은 로그인 처리시 사용된 동일한 소스입니다. 앞으로 자주 사용되므로 함수로 만들도록 합니다. 파일 이름은 func.php입니다.
브라우저로 파일 목록을 보여주기 위해서는 list.php 파일이 필요합니다.
디렉토리 함수에 대해 이해하고 있다면, FTP 제작은 그리 어렵지 않을 것이라 생각됩니다. Function 파일은 로그인 처리시 사용된 동일한 소스입니다. 앞으로 자주 사용되므로 함수로 만들도록 합니다. 파일 이름은 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_conn, true);
}
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($size, 1024)))), 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>
<?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> ";
}
}
?>
</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함수
// 이 함수는 윈도우에서는 동작하지 읺습니다.
// 그러므로 "$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>
0 댓글