php
PHP - FTP를 이용한 원격 파일 업, 다운로드
php ftp에는 다양한 기능을 제공합니다. 그중 서버로 전송된 데이터를 다른 서버, 혹은 호스팅을 사용 중이라도 ftp기능을 지원한다면, 두 서버 간에 데이터 공유가 가능합니다.
다시 말해 웹사이트는 A 호스트로 운영을 하고, 데이터(파일 서버)는 B 호스트에 보관하는데, 사용자 요청시만 A 호스트로 업로드하거나 다운로드합니다.
가능하다면 골드회원은 C 호스트 파일다운로드권한을 주고, 실버회원은 B 호스트 파일다운로드권한 부여를 해서 파일 관리도 가능할 지도 모릅니다.
다음은 사용자가 업로드한 파일을 B 호스트로 원격 업로드합니다.
필요시 업로드한 파일을 A 호스트로 가져 오는데, 이는 사용자가 파일 다운로드 요청이나 이미지 출력 요청을 하였을 때만 처리되는 부분입니다.
사용자가 자료 삭제 요청하였을 때, B 호스트 파일 삭제 처리 부분입니다.
이러한 기능은 서버일 경우 문제되지 않으나 호스팅을 받는 입장이라면 제한이 될 수 있습니다. 그래서 다음 코드로 ftp 지원여부 확인이 가능합니다.
다시 말해 웹사이트는 A 호스트로 운영을 하고, 데이터(파일 서버)는 B 호스트에 보관하는데, 사용자 요청시만 A 호스트로 업로드하거나 다운로드합니다.
가능하다면 골드회원은 C 호스트 파일다운로드권한을 주고, 실버회원은 B 호스트 파일다운로드권한 부여를 해서 파일 관리도 가능할 지도 모릅니다.
다음은 사용자가 업로드한 파일을 B 호스트로 원격 업로드합니다.
<?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, $fp, FTP_BINARY)) {
echo "Successfully uploaded $filename\n";
} else {
echo "There was a problem while uploading $file\n";
}
ftp_close($conn_id);
fclose($fp);
?>
필요시 업로드한 파일을 A 호스트로 가져 오는데, 이는 사용자가 파일 다운로드 요청이나 이미지 출력 요청을 하였을 때만 처리되는 부분입니다.
<?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_file, FTP_BINARY, 0)) {
while(!feof($fp)){
$file .= fread($fp, 1024);
}
// 파일 다운로드나 파일 출력 처리 부분입니다.
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 호스트 파일 삭제 처리 부분입니다.
<?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 지원이 안됩니다.";
}
?>
0 댓글