> 백엔드 개발 > PHP 튜토리얼 > PHP Python FTP 작업 클래스

PHP Python FTP 작업 클래스

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-07-25 08:51:01
원래의
1059명이 탐색했습니다.
PHP Python FTP 작업 클래스
  1. class Ftp {
  2. //FTP 연결 리소스
  3. private $link;
  4. //FTP 연결 시간
  5. public $link_time;
  6. //오류 코드
  7. private $err_code = 0;
  8. //전송 모드 {텍스트 모드: FTP_ASCII, 바이너리 모드: FTP_BINARY}
  9. 공개 $mode = FTP_BINARY;
  10. /**
  11. 초기화 클래스
  12. **/
  13. 공개 함수 start($data)
  14. {
  15. if(empty($data['port']) ) $data['port'] ='21';
  16. if(empty($data['pasv'])) $data['pasv'] =false;
  17. if(empty($data[' ssl'])) $data['ssl'] = false;
  18. if(empty($data['timeout'])) $data['timeout'] = 30;
  19. return $this-> connect($data['서버'],$data['사용자 이름'],$data['비밀번호'],$data['포트'],$data['pasv'],$data['ssl'], $data['timeout']);
  20. }
  21. /**
  22. * FTP 서버에 연결
  23. * @param string $host 서버 주소
  24. * @param string $username 사용자 이름
  25. * @param string $password 비밀번호
  26. * @param 정수 $port 서버 포트 , 기본값은 21
  27. * @param boolean $pasv Passive 모드 활성화 여부
  28. * @param boolean $ssl    SSL 연결 사용 여부
  29. * @param 정수 $timeout 시간 초과 시간
  30. */
  31. 공개 함수 connect($host, $username = '', $password = '', $ port = '21', $pasv = false, $ssl = false, $timeout = 30) {
  32. $start = time();
  33. if ($ssl) {
  34. if (!$this- >link = @ftp_ssl_connect($host, $port, $timeout)) {
  35. $this->err_code = 1;
  36. return false;
  37. }
  38. } else {
  39. if (!$this->link = @ftp_connect($host, $port, $timeout)) {
  40. $this->err_code = 1;
  41. return false;
  42. }
  43. }
  44. if (@ftp_login($this->link, $username, $password)) {
  45. if ($pasv)
  46. ftp_pasv($this->link, true);
  47. $this->link_time = time() - $start;
  48. return true;
  49. } else {
  50. $this->err_code = 1;
  51. return false;
  52. }
  53. register_shutdown_function(array(&$this, 'close'));
  54. }
  55. /**
  56. * 폴더 생성
  57. * @param string $dirname 디렉터리 이름,
  58. */
  59. 공용 함수 mkdir($dirname) {
  60. if ( !$this->link) {
  61. $this->err_code = 2;
  62. return false;
  63. }
  64. $dirname = $this->ck_dirname($dirname);
  65. $nowdir = '/';
  66. foreach ($dirname as $v) {
  67. if ($v && !$this->chdir($nowdir . $v)) {
  68. if ($ nowdir)
  69. $this->chdir($nowdir);
  70. @ftp_mkdir($this->link, $v);
  71. }
  72. if ($v)
  73. $nowdir .= $v . '/';
  74. }
  75. return true;
  76. }
  77. /**
  78. * 파일 업로드
  79. * @param string $remote 원격 저장소 주소
  80. * @param string $local 로컬 저장소 주소
  81. */
  82. 공개 함수 put($remote, $local) {
  83. if (!$this->link) {
  84. $this->err_code = 2;
  85. return false;
  86. }
  87. $dirname = pathinfo($remote, PATHINFO_DIRNAME) ;
  88. if (!$this->chdir($dirname)) {
  89. $this->mkdir($dirname);
  90. }
  91. if (@ftp_put($this-> link, $remote, $local, $this->mode)) {
  92. return true;
  93. } else {
  94. $this->err_code = 7;
  95. return false;
  96. }
  97. }
  98. /**
  99. * 폴더 삭제
  100. * @param string $dirname 디렉터리 주소
  101. * @param boolean $enforce 강제 삭제
  102. */
  103. 공개 함수 rmdir($dirname, $enforce = false) {
  104. if (!$this->link) {
  105. $this->err_code = 2;
  106. return false;
  107. }
  108. $list = $this->nlist($dirname);
  109. if ($list && $enforce) {
  110. $this->chdir($dirname);
  111. foreach ($list as $v) {
  112. $this->f_delete($v);
  113. }
  114. } elseif ( $list && !$enforce) {
  115. $this->err_code = 3;
  116. return false;
  117. }
  118. @ftp_rmdir($this->link, $dirname);
  119. true를 반환합니다.
  120. }
  121. /**
  122. * 刪除指定檔案
  123. * @param string $filename 檔案名稱
  124. */
  125. public function delete($filename) {
  126. if (!$this->link) {
  127. $this->err_code = 2 ;
  128. return false;
  129. }
  130. if (@ftp_delete($this->link, $filename)) {
  131. return true;
  132. } else {
  133. $this-> ;err_code = 4;
  134. return false;
  135. }
  136. }
  137. /**
  138. * 傳回給定目錄的檔案清單
  139. * @param string $dirname 目錄位址
  140. * @return array 檔案清單資料
  141. */
  142. public function nlist($dirname) {
  143. if (! $ $this-this >link) {
  144. $this->err_code = 2;
  145. return false;
  146. }
  147. if ($list = @ftp_nlist($this->link, $dirname )) {
  148. return $list;
  149. } else {
  150. $this->err_code = 5;
  151. return false;
  152. }
  153. }
  154. /* *
  155. * 在 FTP 伺服器上改變目前目錄
  156. * @param string $dirname 修改伺服器上目前目錄
  157. */
  158. public function chdir($dirname) {
  159. if (!$this->link) {
  160. $this->err_code = 2;
  161. return false;
  162. }
  163. if (if (@ ftp_chdir($this->link, $dirname)) {
  164. return true;
  165. } else {
  166. $this->err_code = 6;
  167. return false;
  168. }
  169. }
  170. }
  171. }
  172. }
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. /**
  200. * 取得錯誤訊息
  201. */
  202. public function get_error() {
  203. if (!$this->err_code)
  204. 回傳false;
  205. $err_msg = array(
  206. '1' =>; '伺服器無法連線',
  207. '2' =>; '未連線到伺服器',
'3' =>; '無法刪除非空資料夾',
'4' =>; '無法刪除檔案', '5' =>; '無法取得檔案清單', '6' =>; '無法變更伺服器上的目前目錄',
'7' =>; ' 無法上傳檔案' ); return $err_msg[$this->err_code]; } /** * 偵測目錄名稱 * @param string $url 目錄 * @return 由 / 分開的回傳陣列*/ 介面函數 ck_dirname ($ url) { $url = str_replace('', '/', $url); $urls =explode('/', $url); return $urls; } /** * 關閉FTP連線*/ public function close() { return @ftp_close($this->link); } 複製程式碼
  1. #!/usr/bin/python
  2. #coding=gbk
  3. '''
  4. ftp 자동 다운로드, 자동 업로드 스크립트, 재귀적 디렉터리 작업 가능
  5. '''
  6. from ftplib import FTP
  7. import os,sys,string,datetime,time
  8. import 소켓
  9. class MYFTP:
  10. def __init__(self,hostaddr , 사용자 이름, 비밀번호, 원격 디렉터리, 포트=21):
  11. self.hostaddr = 호스트 추가
  12. self.username = 사용자 이름
  13. self.password = 비밀번호
  14. self.remotedir = 원격 디렉터리
  15. self.port = port
  16. self.ftp = FTP()
  17. self.file_list = []
  18. # self.ftp.set_debuglevel(2)
  19. def __del__(self):
  20. self.ftp.close ()
  21. # self.ftp.set_debuglevel(0)
  22. def login(self):
  23. ftp = self.ftp
  24. try:
  25. timeout = 60
  26. 소켓.setdefaulttimeout(timeout )
  27. ftp.set_pasv(True)
  28. print '%s에 연결 시작' %(self.hostaddr)
  29. ftp.connect(self.hostaddr, self.port)
  30. print '%s에 성공적으로 연결되었습니다. %s' %(self.hostaddr)
  31. print '%s에 로그인을 시작합니다' %(self.hostaddr)
  32. ftp.login(self.username, self.password)
  33. print '성공적으로 로그인되었습니다. % s' %(self.hostaddr)
  34. debug_print(ftp.getwelcome())
  35. 제외 예외:
  36. deal_error("연결 또는 로그인 실패")
  37. 시도:
  38. ftp.cwd (self .remotedir)
  39. 제외(예외):
  40. deal_error('디렉토리 전환 실패')
  41. def is_same_size(self, localfile, remotefile):
  42. try:
  43. remotefile_size = self.ftp.size(remotefile)
  44. 제외:
  45. Remotefile_size = -1
  46. 시도:
  47. localfile_size = os.path.getsize(localfile)
  48. 제외:
  49. localfile_size = - 1
  50. debug_print('lo:%d re:%d' %(localfile_size, remotefile_size),)
  51. if remotefile_size == localfile_size:
  52. return 1
  53. else:
  54. return 0
  55. def download_file (self, localfile, remotefile):
  56. if self.is_same_size(localfile, remotefile):
  57. debug_print('%s 파일의 크기가 동일하므로 다운로드할 필요가 없습니다.' %localfile)
  58. return
  59. else:
  60. debug_print('>>>>>>>>>>>>%s 파일 다운로드 ... ...' %localfile)
  61. #return
  62. file_handler = open(localfile, 'wb')
  63. self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
  64. file_handler.close()
  65. def download_files( self, localdir='./', remotedir='./'):
  66. 시도:
  67. self.ftp.cwd(remotedir)
  68. 제외:
  69. debug_print( '디렉터리 %s이(가) 존재하지 않습니다. 계속하세요...' %remotedir)
  70. return
  71. 그렇지 않은 경우 os.path.isdir(localdir):
  72. os.makedirs(localdir)
  73. debug_print('Switch %s' %self.ftp.pwd())
  74. self.file_list = []
  75. self.ftp.dir(self.get_file_list)
  76. remotenames = self.file_list
  77. #print( 원격 이름)
  78. #return
  79. 원격 이름의 항목:
  80. filetype = item[0]
  81. filename = item[1]
  82. local = os.path.join(localdir, filename)
  83. if filetype == 'd' :
  84. self.download_files(local, 파일 이름)
  85. elif filetype == '-':
  86. self.download_file(local, 파일 이름)
  87. self.ftp.cwd ('..')
  88. debug_print('상위 디렉터리 %s로 돌아갑니다' %self.ftp.pwd())
  89. def upload_file(self, localfile, remotefile):
  90. os.path가 아닌 경우 .isfile(localfile):
  91. return
  92. if self.is_same_size(localfile, remotefile):
  93. debug_print('Skip [equal]: %s' %localfile)
  94. return
  95. file_handler = open (localfile, 'rb')
  96. self.ftp.storbinary('STOR %s' %remotefile, file_handler)
  97. file_handler.close()
  98. debug_print('전송됨: %s' %localfile)
  99. def upload_files(self, localdir= './', remotedir = './'):
  100. 그렇지 않은 경우 os.path.isdir(localdir):
  101. return
  102. localnames = os.listdir(localdir)
  103. self.ftp.cwd (remotedir)
  104. for item in localnames:
  105. src = os.path.join(localdir, item)
  106. if os.path.isdir(src):
  107. 시도:
  108. self.ftp .mkd(item)
  109. 제외:
  110. debug_print('디렉토리가 이미 %s' %item)
  111. self.upload_files(src, item)
  112. else:
  113. self.upload_file(src, item)
  114. self.ftp.cwd('..')
  115. def get_file_list(self, line):
  116. ret_arr = []
  117. file_arr = self.get_filename(line)
  118. if file_arr[1]이 ['.', '..']에 없음:
  119. self.file_list.append(file_arr)
  120. def get_filename(self, line ):
  121. pos = line .rfind(':')
  122. while(line[pos] != ' '):
  123. pos = 1
  124. while(line[pos] == ' ') :
  125. pos = 1
  126. file_arr = [line[0], line[pos:]]
  127. return file_arr
  128. def debug_print(s):
  129. print(s)
  130. def deal_error (e):
  131. timenow = time.localtime()
  132. datenow = time.strftime('%Y-%m-%d', timenow)
  133. logstr = '%s 오류가 발생했습니다: %s ' %(datenow, e)
  134. debug_print(logstr)
  135. file.write(logstr)
  136. sys.exit()
  137. if __name__ == '__main__':
  138. file = open("log.txt", " a")
  139. timenow = time.localtime()
  140. datenow = time.strftime('%Y-%m-%d', timenow)
  141. logstr = datenow
  142. # 다음 변수를 구성합니다
  143. hostaddr = 'localhost' # ftp 주소
  144. username = 'test' # Username
  145. password = 'test' # 비밀번호
  146. port = 21 # 포트 번호
  147. rootdir_local = '.' os.sep 'bak/' # 로컬 디렉터리
  148. rootdir_remote = './' # 원격 디렉터리
  149. f = MYFTP(hostaddr, 사용자 이름, 비밀번호, rootdir_remote, 포트)
  150. f.login()
  151. f.download_files(rootdir_local, rootdir_remote)
  152. timenow = time.localtime()
  153. datenow = time.strftime('%Y-%m-%d', timenow )
  154. logstr = " - %s가 백업 n을 성공적으로 실행했습니다." �tenow
  155. debug_print(logstr)
  156. file.write(logstr)
  157. file.close()
코드 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿