ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。
ftplib模块中各个函数功能如下:
ftp=FTP() #设置变量 ,实例化
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd("xxx/xxx") #更改远程目录
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write
#以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize)
#接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit #退出ftp
ftp.dir() #显示目录下文件信息
ftp.pwd() #返回当前所在位置
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.mkd(pathname) #新建远程目录
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(oldname, newname) #将oldname修改名称为newname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP目标文件
# coding: utf-8
#import os
from ftplib import FTP
import datetime
"""
可以实现上传 下载单个文件
"""
def ftp_connect(host,port, username, password):
ftp = FTP()
# ftp.set_debuglevel(2)
ftp.connect(host, port)
ftp.login(username, password)
#ftp.set_pasv(False)
return ftp
"""
从ftp服务器下载文件
remotepath:远程路径
localpath:本地路径
"""
def download_file(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'wb')
ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
ftp.set_debuglevel(0)
fp.close()
"""
从本地上传文件到ftp
remotepath:远程路径
localpath:本地路径
"""
def upload_file(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'rb')
ftp.storbinary('STOR ' + remotepath, fp, bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == "__main__":
host = '192.168.1.XXX' # IP
port = 21 # 端口
username = 'ftpadmin' # 用户名
password = 'ftpadmin' # 密码
ftp = ftp_connect(host, port, username, password)
upload_file(ftp, r"/CMAQ/ftp.log", r"/run/media/test/mydata/data_post/ftp.log")
download_file(ftp, r"/CMAQ/ftp.log", r"/run/media/test/mydata/data_post/ftp.log")
ftp.quit()
案例二: 利用ftp上传文件至服务器
该功能为通过前端上传文件,后端通过ftp将文件传至另一台配置好ftp的windows电脑上。(windows的ftp配置)部署服务的服务器和存文件的服务器不是一台,所以没有把文件存到工程目录下static里面。
后端代码如下:
@api.route('/upload_source_file', methods=['POST', 'GET'])
def upload_source_file():
# 文件信息准备
files = request.files['file']
filename = os.path.splitext(files.filename)[0]
postfix = os.path.splitext(files.filename)[1]
hostname = 'xx.xx.xx.xxx'
username = 'administrator'
password = 'xxxxxxxxx'
port = 21
reload(sys)
sys.setdefaultencoding('utf-8')
try:
# 连接远程ftp创建文件并上传
ftp = FTP()
ftp.connect(hostname, port)
ftp.login(username, password)
# 判断目录里面是否有该文件夹
if filename in ftp.nlst():
# 进入该目录
ftp.cwd(filename)
# 如果存在,则在该文件夹存入,以时间唯一命名
unique_name = str(datetime.now().strftime('%Y-%m-%d')) + '-' + filename + postfix
ftp.storbinary('STOR %s' % unique_name, files)
ftp.close()
else:
ftp.mkd(filename)
ftp.cwd(filename)
unique_name = str(datetime.now().strftime('%Y-%m-%d')) + '-' + filename + postfix
ftp.storbinary('STOR %s' % unique_name, files)
ftp.close()
try:
number = len(db.session.query(Source).all())
source = db.session.query(Source).filter(Source.number == number).first()
source.net_server = 'ftp://xx.xx.xx.xxx/%s/%s' % (filename, unique_name)
db.session.add(source)
db.session.commit()
except Exception as e:
print e
db.session.rollback()
return jsonify(status_code.ADD_NET_SERVER_ERROR)
return jsonify(status_code.SUCCESS)
except Exception as e:
print e
return jsonify(status_code.FTP_TRANSFER_ERROR)
其原理就是通过搭建的ftp,通过在浏览器输入的ip地址加文件夹及文件名便可下载相应文件,然后在前端做一个a标签即可下载。