python 利用ftp上传文件至服务器、从服务器下载文件

ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。

1.函数介绍

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目标文件

2 .python实现 利用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标签即可下载。

你可能感兴趣的:(python-web,Linux,python,python,ftp,linux)