php python ftp操作類

來源:互聯網
上載者:User
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. public $mode = FTP_BINARY;
  10. /**
  11. 初始化類
  12. **/
  13. public function 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['server'],$data['username'],$data['password'],$data['port'],$data['pasv'],$data['ssl'],$data['timeout']);
  20. }
  21. /**
  22. * 串連FTP伺服器
  23. * @param string $host    伺服器位址
  24. * @param string $username   使用者名稱
  25. * @param string $password   密碼
  26. * @param integer $port     伺服器連接埠,預設值為21
  27. * @param boolean $pasv 是否開啟被動模式
  28. * @param boolean $ssl      是否使用SSL串連
  29. * @param integer $timeout 逾時時間 
  30. */
  31. public function 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. public function 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. public function 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. public function 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. return 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->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 (@ftp_chdir($this->link, $dirname)) {
  164. return true;
  165. } else {
  166. $this->err_code = 6;
  167. return false;
  168. }
  169. }
  170. /**
  171. * 擷取錯誤資訊
  172. */
  173. public function get_error() {
  174. if (!$this->err_code)
  175. return false;
  176. $err_msg = array(
  177. '1' => 'Server can not connect',
  178. '2' => 'Not connect to server',
  179. '3' => 'Can not delete non-empty folder',
  180. '4' => 'Can not delete file',
  181. '5' => 'Can not get file list',
  182. '6' => 'Can not change the current directory on the server',
  183. '7' => 'Can not upload files'
  184. );
  185. return $err_msg[$this->err_code];
  186. }
  187. /**
  188. * 檢測目錄名
  189. * @param string $url 目錄
  190. * @return 由 / 分開的返回數組
  191. */
  192. private function ck_dirname($url) {
  193. $url = str_replace('', '/', $url);
  194. $urls = explode('/', $url);
  195. return $urls;
  196. }
  197. /**
  198. * 關閉FTP串連
  199. */
  200. public function close() {
  201. return @ftp_close($this->link);
  202. }
  203. }
複製代碼
  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 socket
  9. class MYFTP:
  10. def __init__(self, hostaddr, username, password, remotedir, port=21):
  11. self.hostaddr = hostaddr
  12. self.username = username
  13. self.password = password
  14. self.remotedir = 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. socket.setdefaulttimeout(timeout)
  27. ftp.set_pasv(True)
  28. print '開始串連到 %s' %(self.hostaddr)
  29. ftp.connect(self.hostaddr, self.port)
  30. print '成功串連到 %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. except Exception:
  36. deal_error("串連或登入失敗")
  37. try:
  38. ftp.cwd(self.remotedir)
  39. except(Exception):
  40. deal_error('切換目錄失敗')
  41. def is_same_size(self, localfile, remotefile):
  42. try:
  43. remotefile_size = self.ftp.size(remotefile)
  44. except:
  45. remotefile_size = -1
  46. try:
  47. localfile_size = os.path.getsize(localfile)
  48. except:
  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. try:
  67. self.ftp.cwd(remotedir)
  68. except:
  69. debug_print('目錄%s不存在,繼續...' %remotedir)
  70. return
  71. if not os.path.isdir(localdir):
  72. os.makedirs(localdir)
  73. debug_print('切換至目錄 %s' %self.ftp.pwd())
  74. self.file_list = []
  75. self.ftp.dir(self.get_file_list)
  76. remotenames = self.file_list
  77. #print(remotenames)
  78. #return
  79. for item in remotenames:
  80. filetype = item[0]
  81. filename = item[1]
  82. local = os.path.join(localdir, filename)
  83. if filetype == 'd':
  84. self.download_files(local, filename)
  85. elif filetype == '-':
  86. self.download_file(local, filename)
  87. self.ftp.cwd('..')
  88. debug_print('返回上層目錄 %s' %self.ftp.pwd())
  89. def upload_file(self, localfile, remotefile):
  90. if not os.path.isfile(localfile):
  91. return
  92. if self.is_same_size(localfile, remotefile):
  93. debug_print('跳過[相等]: %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. if not 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. try:
  108. self.ftp.mkd(item)
  109. except:
  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] not in ['.', '..']:
  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' # 使用者名稱
  145. password = 'test' # 密碼
  146. port = 21 # 連接埠號碼
  147. rootdir_local = '.' + os.sep + 'bak/' # 本地目錄
  148. rootdir_remote = './' # 遠程目錄
  149. f = MYFTP(hostaddr, username, password, rootdir_remote, port)
  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" %datenow
  155. debug_print(logstr)
  156. file.write(logstr)
  157. file.close()
複製代碼
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.