Python - Ftp操作

由于将blog从七牛云迁移到了阿里虚拟空间上,操作全部由ftp来完成,脚本由php写的,更换成python,
后面更改成多线程上传吧,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# -*- coding:utf-8 -*-

import sys
import os
import json
from ftplib import FTP

_XFER_FILE = 'FILE'
_XFER_DIR = 'DIR'


class Xfer(object):
'''
@note: upload local file or dirs recursively to ftp server
'''

def __init__(self):
self.ftp = None

def __del__(self):
pass

def setFtpParams(self, ip, uname, pwd, port=21, timeout=60):
self.ip = ip
self.uname = uname
self.pwd = pwd
self.port = port
self.timeout = timeout

def initEnv(self):
if self.ftp is None:
self.ftp = FTP()
print '### connect ftp server: %s ...' % self.ip
self.ftp.connect(self.ip, self.port, self.timeout)
self.ftp.login(self.uname, self.pwd)
print self.ftp.getwelcome()

def clearEnv(self):
if self.ftp:
self.ftp.close()
print '### disconnect ftp server: %s!' % self.ip
self.ftp = None

def uploadDir(self, localdir='./', remotedir='/htdocs/'):
if not os.path.isdir(localdir):
return
self.ftp.cwd(remotedir)
for file in os.listdir(localdir):
src = os.path.join(localdir, file)
if os.path.isfile(src):
self.uploadFile(src, file)
elif os.path.isdir(src):
try:
self.ftp.mkd(file)
except:
sys.stderr.write('the dir is exists %s' % file)
self.uploadDir(src, file)
self.ftp.cwd('..')

def uploadFile(self, localpath, remotepath='./'):
if not os.path.isfile(localpath):
return
print '+++ upload %s to %s:%s' % (localpath, self.ip, remotepath)
self.ftp.storbinary('STOR ' + remotepath, open(localpath, 'rb'))

def __filetype(self, src):
if os.path.isfile(src):
index = src.rfind('\\')
if index == -1:
index = src.rfind('/')
return _XFER_FILE, src[index + 1:]
elif os.path.isdir(src):
return _XFER_DIR, ''

def upload(self, src):
filetype, filename = self.__filetype(src)

self.initEnv()
if filetype == _XFER_DIR:
self.srcDir = src
self.uploadDir(self.srcDir)
elif filetype == _XFER_FILE:
self.uploadFile(src, filename)
self.clearEnv()


if __name__ == '__main__':
srcDir = r"./public"
xfer = Xfer()
xfer.setFtpParams('IP', 'username', 'password')
xfer.upload(srcDir)
0%