在开始之前需要搭建FTP服务器,以CentOS为例,参见上一篇博客:【Linux配置vsftp】http://www.neusncp.com/user/blog?id=66
在windows环境里,python3上传ftp应用中,中文路径会出现乱码问题,但是Python3的字符串没有直接的decode方法,因此在ftp客户端配置编码中使用GB18030编码,乱码问题解决。完整代码如下:
#-*- coding:utf-8 -*-
import os
from watchdog.observers import Observer
from watchdog.events import *
import time
import threading
import ftplib
def ftpconnect():
#ftp服务器的IP
ftp_server = 'neutcp.top'
#ftp的用户名
username = '你的账户'
#用户的密码
password = '你的密码'
#创建一个ftp的实例
ftp=ftplib.FTP(ftp_server)
ftp.encoding = 'GB18030'
#打开调试级别2,显示详细信息
ftp.set_debuglevel(2)
#连接ftp服务器,需要输入IP,端口,以及超时时间
#连接的用户名、密码
ftp.login(username,password)
pwd_path = ftp.pwd()
print("FTP当前路径:", pwd_path)
return ftp
def upload_to_ftp(localpath, filename):
try:
ftp = ftpconnect()
remotepath = "/%s"%filename
print(ftp.getwelcome())
bufsize = 1024
with open(localpath,'rb') as fp:
fp.seek(0)
ftp.storbinary('STOR ' + remotepath, fp, bufsize)
ftp.set_debuglevel(0)
ftp.quit()
except Exception as e:
print(e)
class FileEventHandler(FileSystemEventHandler):
def __init__(self):
FileSystemEventHandler.__init__(self)
def on_moved(self, event):
if event.is_directory:
print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
else:
print("file moved from {0} to {1}".format(event.src_path,event.dest_path))
# upload_to_ftp(event.src_path, os.path.basename(event.src_path))
def on_created(self, event):
if event.is_directory:
print("directory created:{0}".format(event.src_path))
else:
print("file created:{0}".format(event.src_path))
upload_to_ftp(event.src_path, os.path.basename(event.src_path))
def on_deleted(self, event):
if event.is_directory:
print("directory deleted:{0}".format(event.src_path))
else:
print("file deleted:{0}".format(event.src_path))
def on_modified(self, event):
if event.is_directory:
print("directory modified:{0}".format(event.src_path))
else:
print("file modified:{0}".format(event.src_path))
# upload_to_ftp(event.src_path, os.path.basename(event.src_path))
if __name__ == "__main__":
observer = Observer()
event_handler = FileEventHandler()
observer.schedule(event_handler,"d:/",True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
运行代码可能会出现固定路径的错误,需要修改vsftpd.conf里面的配置:
chroot_list_enable=NO