今天同事问我用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