今天同事问我用python来实现ftp上传文件是否熟悉,因为之前没接触过,所以现在研究下,通过参考了一些文档,简单编写了code,已测试通过!Ftp服务端相关的配置我这里就不啰嗦了!希望对大家有所帮助!
python代码如下:
#!/usr/bin/env python #-*- coding:utf-8 -*- #author:icyboy from ftplib import FTP import os,sys,string,datetime,time #import traceback hostaddr = '192.168.2.58' #ftp地址 username = 'jiunile' #用户名 password = '123456' #密码 port = 21 #端口号 rootdir_local = '/Users/icyboy/upload/' #本地目录 rootdir_remote = './' #远程目录,注意如果ftp是chroot的话就不能写/home/jiunile/xxx/,默认进去就是/目录了,只需要写xxx/即可,不然会提示550没权限 local_file = '/Users/icyboy/upload/1.txt' #本地文件 remote_filename = '1.txt' #保存到远程目录文件名 def login(remotedir='.'): try: ftp.set_pasv(True) #模式:被动模式 ftp.connect(hostaddr, port) #连接:地址端口 ftp.login(username, password) #登录:用户密码 log("---------------------------------------------") log("连接已完成:"+ftp.getwelcome()) except Exception: log("连接或登录失败") sys.exit() #返回一个 SystemExit异常 (退出程序) try: #print ftp.pwd() #打印ftp目录 #ftp.retrlines('LIST') #列出ftp目录下的信息 ftp.cwd(remotedir) except Exception: log("切换目录失败") sys.exit() def is_same_size( localfile, remotefile): try: remotefile_size = ftp.size(remotefile) except: remotefile_size = -1 try: localfile_size = os.path.getsize(localfile) except: localfile_size = -1 if remotefile_size == localfile_size: return 1 else: return 0 #上传文件函数 def upload_file( localfile, remotefile): if not os.path.isfile(localfile): #如果文件不存在 return if is_same_size(localfile, remotefile): #本地与远程文件大小一样的话(文件存在) log('文件已存在: %s' %localfile) return file_handler = open(localfile, 'rb') #打开本地要上传的文件 ftp.storbinary('STOR %s' %remotefile, file_handler) #上传本地文件 file_handler.close() #关闭打开的文件 log('文件已传送: %s' %localfile) #创建子目录并执行上面的 上传文件upload_file函数 def upload_files( localdir='./', remotedir = './'): if not os.path.isdir(localdir): #目录是否存在 return localnames = os.listdir(localdir) #获取目录中的文件及子目录的列表 ftp.cwd(remotedir) #变更工作目录 #循环目录下的文件与子目录 for item in localnames: src = os.path.join(localdir, item) #连接字符串 if os.path.isdir(src): #目录是否存在 try: ftp.mkd(item) #创建目录 except: log('目录已存在: %s' %item) upload_files(src, item) else: upload_file(src, item) #上传文件(upload_file函数) ftp.cwd('..') #变更工作目录 #记录日志函数 def log(msg): datenow = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) logstr = '%s : %s \n' %(datenow, msg) logfile.write(logstr) if __name__ == '__main__': logfile = open("/tmp/log.txt", "a") ftp = FTP() login(rootdir_remote) #上传文件夹下面的文件 upload_files(rootdir_local,rootdir_remote) #上传某个文件 #upload_file(local_file, remote_filename) log('操作已完成') log('---------------------------------------------') logfile.close()
php代码如下:
<?php $hostaddr = "192.168.2.58"; $username = "mm"; $password = "123456"; $local_file = "/Users/icyboy/upload/1.txt"; $remote_filename = "./1.txt"; $conn_id = ftp_connect($hostaddr,0) or die("Couldn't connect to $hostaddr"); $login_result = ftp_login($conn_id, $username, $password); if ( !$conn_id || !$login_result ) { echo 'FTP连接失败!\n'; exit; } else { echo "FTP连接成功!\n"; } $upload = ftp_put($conn_id, $remote_filename, $local_file, FTP_BINARY) or die("连接失败!"); ftp_close($conn_id); if ( !$upload ) echo "上传失败!\n"; else echo "上传成功!\n";
shell代码如下:
#!/bin/sh TRANS_DATE=`date +%y%m%d%H%M` echo " open 192.168.2.58 prompt user mm 123456 cd . binary lcd /Users/icyboy/upload mput 1.txt close bye "|ftp -v -n |sed 's/^/>/g' >>run.log #open 192.168.2.58 建立FTP服务器连接 #user mm 123456 设置FTP服务器登录时的用户名和密码 #cd . 设置要上传到FTP服务器上目标文件夹 #lcd /Users/icyboy/upload 进入要进入上传文件的目录 #mput 1.txt 将1.txt传至服务器目标文件夹 #ftp -v -n -v 显示远程服务器所有响应信息,-n 限制FTP的自动登录 #sed 's/^/>/g' 每行开头处都替换为> if [ -s run.log ] #判断run.log是否存在且不为空 then echo "SYSTEM: FTP LOGGING SUCCESS!!!" SEARCH=`grep 'bytes sent in' run.log` if [ $? -eq 0 ] #$?为上次命令的退出状态,$?=0表示从中寻找到bytes sent in关键字 then echo "FTP transfer file OK" rm run.log else echo "FTP transfer file fail" mv run.log ${TRANS_DATE}_fail.log fi else echo "SYSTEM: FTP LOGGING FAIL!!!" exit 1 fi