ホームページ  >  記事  >  バックエンド開発  >  出典: link タグ:phppythonftp 操作クラス

出典: link タグ:phppythonftp 操作クラス

WBOY
WBOYオリジナル
2016-07-25 08:51:01962ブラウズ
出典: link タグ:phppythonftp 操作クラス
  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['サーバー'],$data['ユーザー名'],$data['パスワード'],$data['ポート'],$data['pasv'],$data['ssl'],$data ['タイムアウト']);
  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 配列ファイルリストデータ
  141. * /
  142. public function nlist($dirname) {
  143. if (!$this->link) {
  144. $this->gt;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' => 'サーバーに接続できません',
  178. '2' => 'サーバーに接続していません',
  179. '3' => '空ではないフォルダーは削除できません',
  180. '4' => 'ファイルを削除できません',
  181. '5' => 'ファイルリストを取得できません',
  182. '6' => 'サーバー上の現在のディレクトリを変更できません',
  183. '7' => 'ファイルをアップロードできません'
  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,文字列, 日付時刻, 時刻
  8. インポートソケット
  9. クラス MYFTP:
  10. def __init__(self, hostaddr, ユーザー名, パスワード, リモートディレクトリ, port=21):
  11. self.hostaddr = hostaddr
  12. self.username = ユーザー名
  13. self.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. ソケット.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. 例外:
  36. deal_error( "接続またはログインに失敗しました")
  37. try:
  38. ftp.cwd(self.remotedir)
  39. Exception(Exception):
  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. try:
  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. try:
  67. self.ftp.cwd(remotedir)
  68. 例外:
  69. debug_print('Directory %s は存在しません。続行します。 ..' %remotedir)
  70. return
  71. if 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 inremotename:
  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. そうでない場合 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('Transmitted: %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. localnames の項目の場合:
  105. src = os .path.join(localdir, item)
  106. if os.path.isdir(src):
  107. try:
  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] 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. パスワード = 'test' # パスワード
  146. port = 21 # ポート番号
  147. rootdir_local = '.' + os.sep + 'bak/' # ローカルディレクトリ
  148. rootdir_remote = './' # リモートディレクトリ
  149. f = MYFTP(hostaddr, ユーザー名, パスワード, 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()
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。