基于Python实现Ftp文件上传,下载

 

by:授客 QQ1033553122

测试环境:

Ftp客户端:Windows平台

Ftp服务器:Linux平台

Python版本:Python 2.7.6

 

实现功能:

支持FTP文件上传、下载,可以上传目录(分区除外),也可以上传单个文件;可以下载整个目录(/根目录除外),也可以下载单个文件

 

实践代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
from ftplib import  FTP
import  ConfigParser
import os
 
class MyFTP:
    def __init__(self, ftp_conf):
        '''ftp服务器主机IP,端口等配置'''
        config = ConfigParser.ConfigParser()
        config.read(ftp_conf)
 
        self.ftp_host = config.get('FTP', 'ftp_host')
        self.ftp_port = config.get('FTP', 'ftp_port')
        self.ftp_user = config.get('FTP', 'ftp_user')
        self.ftp_passwd = config.get('FTP', 'ftp_passwd')
        self.ftp = FTP()
 
 
    def get_ftp_host(self):
        return self.ftp_host
 
    def get_ftp_port(self):
        return self.ftp_port
 
    def get_ftp_user(self):
        return self.ftp_user
 
    def get_ftp_passwd(self):
        return self.ftp_passwd
 
    # 连接到ftp服务器
    def connect(self):
        print('is connecting to ftp server %s on %s' % (self.ftp_host, self.ftp_port))
        self.ftp.connect(self.ftp_host, self.ftp_port)
 
    # 登陆到ftp服务器
    def login(self):
        print('ready to login ftp server')
        self.ftp.login(self.ftp_user, self.ftp_passwd)
        print('login ftp server successfully')
        print(self.ftp.getwelcome())
 
    # 友好的关闭连接
    def quit(self):
        try:
            self.ftp.quit()
            print('colose ftp connection successfully')
        except Exception as e:
            print('%s' % e)
 
    # 上传文件夹
    def upload_folder(self, local_path='../screenshot_lib', remote_path='/home/testacc'):
        if not os.path.isdir(local_path):
            print('出错了,请选择要上传的文件夹')
            return
        local_path = local_path.strip() # 以防万一,去除首尾空格
        local_path = local_path.rstrip('/') # 去除右部 /
        local_path = local_path.rstrip('\\') # 去除右部 \\
        remote_path = remote_path.strip()
        remote_path = remote_path.rstrip('/')
        remote_path = remote_path.rstrip('\\')
 
        self.ftp.cwd(remote_path)
 
        last_dir = os.path.basename(local_path)
        remote_path = os.path.join(remote_path, last_dir)
        remote_path = remote_path.replace('\\', '/') # 转为linux标准路径
        # 如果ftp服务器上不存在该路径,则创建对应路径下的目录
        try:
            self.ftp.mkd(last_dir)
        except:
            #print('dir: %s already exists' % last_dir)
            pass
 
        sub_items = os.listdir(local_path)
        for sub_item in sub_items:
            sub_item_path = os.path.join(local_path, sub_item)
            if os.path.isdir(sub_item_path): #如果子项目为目录
                self.upload_folder(sub_item_path, remote_path)
            else:
                self.upload_file(sub_item_path, remote_path)
 
    # 上传文件
    def upload_file(self, src_file_path, remote_path):
        remote_file_name = os.path.split(src_file_path)[1]
        remote_path = remote_path + '/' + remote_file_name
        try: #如果文件不存在,调用file.size(filename)会报错
            if self.ftp.size(remote_path) != None:
                print("文件%s已存在" % remote_path)
                return
        except Exception as e:
            pass
 
        with open(src_file_path, 'rb') as file_handler:
             self.ftp.storbinary('STOR %s' % remote_path , file_handler)
             print('文件:%s 已经上传到ftp' % src_file_path)
 
 
    # 下载目录
    def download_dir(self,local_path, remote_path):
        if os.path.isfile(local_path):
            print('出错了,请选择文件保存位置')
            return
        local_path = local_path.strip() # 以防万一,去除首尾空格
        remote_path = remote_path.strip()
        remote_path = remote_path.rstrip('/')
        remote_path = remote_path.rstrip('\\')
 
        last_dir = os.path.basename(remote_path)
        local_path = os.path.join(local_path, last_dir)
        local_path = local_path.replace('/', '\\') # 转为Windows标准路径
        # 如果本地客户端不存在该路径,则创建对应路径下的目录
        if not os.path.isdir(local_path):
            os.mkdir(local_path)
 
        sub_items = self.ftp.nlst(remote_path)
        for sub_item in sub_items:
            try:
                self.ftp.cwd(sub_item) #如果子项目为目录
                self.download_dir(local_path, sub_item)
            except Exception: # 非目录
                self.download_file(local_path, sub_item)
 
    def download_file(self, local_path, remote_file_path):

if os.path.isdir(local_file_path):

             print('请选择文件保存目录路径')
             return
                last_file_name = os.path.split(remote_file_path)[1]
        local_file_path = os.path.join(local_path, last_file_name)

 

        if os.path.isfile(local_file_path):
            local_file_path = local_file_path.replace('\\', '/')
            print('文件:%s 已存在' % local_file_path)
            return
 
        with open(local_file_path, 'wb') as file_handle:
            self.ftp.retrbinary('RETR %s' % remote_file_path, file_handle.write)
 
if __name__ == '__main__':
    ftp = MyFTP('./config/ftp.conf')
    ftp.connect()
    ftp.login()
    ftp.upload_folder()
    ftp.upload_folder('E:\\dir1')
    # ftp.upload_folder('E:\\dir1\\')
    # ftp.upload_folder('E:/dir1/')
    # ftp.download_dir('E:\\', '/home/testacc')
    # ftp.download_dir('E:/', '/home/testacc')
    ftp.download_file('E:\\', '/home/testacc/testfile')
    ftp.quit()
 
ftp.conf配置如下:
[FTP]
ftp_host = 192.168.1.103
ftp_port = 21
ftp_user = testacc
ftp_passwd = testacc
 

测试数据如下:


pdf版本下载地址:基于Python实现Ftp文件上传,下载.pdf

Python 基于Python实现Ftp文件上传,下载的更多相关文章

  1. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  2. java/struts/Servlet文件下载与ftp文件上传下载

    1.前端代码 使用超链接到Struts的Action或Servlet <a target="_blank" href="ftpFileAction!download ...

  3. python 实现远端ftp文件上传下载

    python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...

  4. 4.1 - FTP文件上传下载

    题目:开发一个支持多用户同时在线的FTP程序要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在f ...

  5. java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

    //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...

  6. ftp文件上传下载命令

    介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验.  查看远程ftp服务器上用户lte**** ...

  7. ftp文件上传下载实用命令

    连接 >ftp yourhost >user yourusername >password your password 顺利的话连接成功 >dir ;获取remote目录列表 ...

  8. Java 利用Apache Commons Net 实现 FTP文件上传下载

    package woxingwosu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  9. 3.2 - FTP文件上传下载

    题目:开发一个支持多用户同时在线的FTP程序要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在f ...

随机推荐

  1. Nutch的nutch-default.xml和regex-urlfilter.txt的中文解释

    nutch-default解释.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl&qu ...

  2. GPS/轨迹追踪、轨迹回放、围栏控制

    折腾一个多月终于弄完了这个项目,起初都未曾接触GPS/轨迹追踪.轨迹回放.圈划围栏...等一些在百度地图或者Googel地图操作的一些业务,后端的业务相对来说简单点 cas单点登录,mongdb灵活的 ...

  3. 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  4. screen 实战后台命令执行备份

    一.安装 [root@vmware ~]# yum install -y screen 二.直接在命令行键入 screen 命令 [root@vmware ~]# screen 三.暂时终端会话 那么 ...

  5. 【IT笔试面试题整理】二叉树中和为某一值的路径--所有可能路径

    [试题描述] You are given a binary tree in which each node contains a value. Design an algorithm to print ...

  6. ibatis in的用法

    <dynamic-mapped-statement name="queryLabelservicecodeLogSize" result-class="java.l ...

  7. let‘s encrypt之nginx-https没有小锁

    1.使用let's encrypt 加密后的nginx,访问的时候,发现没有小锁,chrome中: 火狐浏览器上: 会看到如上信息,这是因为css.图片或javascript任然通过http提供,可以 ...

  8. Java创建线程的两种方式

    方式 继承Thread类 实现Runnable方法 实例 #继承Thread类 public class ThreadTest2 extends Thread { private int thread ...

  9. 代码统计工具cloc

    https://sourceforge.net/projects/cloc/files/cloc/v1.64/

  10. 下拉加载更多DEMO(js实现)

    项目的一个前端页面展示已购买商品时,要求能下拉加载更多.花了点时间研究这个功能,以前没做过. 首先需要给div加scroll事件,监听滚动条滚动动作.那何时触发加载动作呢?当滚动条滚到底的时候.如何判 ...