今天同事问我用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代码如下:
$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