应用场景:从国内往国外上传,因国际带宽影响,速度很慢,于是做了一个中转FTP,而自动上传需求也就诞生了。
代码地址:sftp类型:直接贴脚本:
#!/usr/bin/env python# -*- coding:utf-8 -*-# This is a new file will be automatically uploaded to the ftp python script.# Author: http://blog.coocla.org import pyinotifyimport osfrom ftplib import FTP WATCHDIR="/tmp/"HOST="xxxxx"USER="xxxxx"PASS="xxxxx"pid_file="/tmp/monitor_upload.pid"log_file="/tmp/monitor_upload.log" class OnCreateClick(pyinotify.ProcessEvent): def process_IN_CREATE(self, event): abspath=os.path.join(event.path, event.name) if os.path.isdir(abspath): print "create directory: %s" % event.name elif os.path.isfile(abspath): print "create file: %s" % event.name relname=abspath.split(WATCHDIR)[1] relpath=os.path.dirname(relname) upload(abspath, relpath, event.name) def main(): wm = pyinotify.WatchManager() notifier = pyinotify.Notifier(wm, OnCreateClick()) wm.add_watch(WATCHDIR, pyinotify.IN_CREATE, rec=True, auto_add=True) notifier.loop(daemonize=True, pid_file=pid_file, stdout=log_file) def upload(abspath, relpath, filename): ftp = FTP() ftp.connect(HOST) ftp.login(USER, PASS) bufsize = 1024 ftp.cwd("xxxxxxx") try: ftp.cwd(relpath) except: for remote_path in relpath.split(os.path.sep): ftp.mkd(remote_path) ftp.cwd(remote_path) filehandler = open(abspath, "rb") try: ftp.storbinary("STOR " + filename, filehandler, bufsize) print "Upload file %s success." % abspath except: print "Upload file %s error." % abspath filehandler.close() ftp.quit() if __name__ == '__main__': if os.path.isfile(pid_file): os.remove(pid_file) main()