python基于FTP实现文件传输相关功能代码实例


Posted in Python onSeptember 28, 2019

这篇文章主要介绍了python基于FTP实现文件传输相关功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

本实例有文件传输相关功能,包括:文件校验、进度条打印、断点续传

客户端示例:

import socket
import json
import os
import hashlib

CODE = {
  '1001':'重新上传文件'
}

def file_md5(file_path):
  obj = open(file_path,'rb')
  m = hashlib.md5()
  for line in obj:
    m.update(line)
  obj.close()
  return m.hexdigest()

def jdt(size,total_size):
  '''
  显示进度条
  '''
  val = int(size/total_size * 100)
  print('\r%s%%|%s' %(val,'#'*val,),end='')

def send_file(exist_size,file_total_size):
  '''
  发送文件
  :param exist_size: 开始读取字节的位置
  :param file_total_size: 文件大小
  :return:
  '''
  f = open(file_path, 'rb')
  f.seek(exist_size)
  send_size = exist_size
  while send_size < file_total_size:
    data = f.read(1024)
    sk.sendall(data)
    send_size += len(data)
    jdt(send_size,file_total_size)
  f.close()
  print('上传成功')

def upload(file_path):
  '''文件上传(含断点)'''
  file_path = '111.jpg'
  file_md5_val = file_md5(file_path)
  file_name = os.path.basename(file_path)
  file_size = os.stat(file_path).st_size

  cmd_dict = {'cmd': 'upload', 'file_name': file_name, 'size': file_size, 'md5': file_md5_val}
  upload_cmd_bytes = json.dumps(cmd_dict).encode('utf8')
  sk.sendall(upload_cmd_bytes)

  # 2.等待服务端相应
  response = json.loads(sk.recv(8096).decode('utf8'))
  if response['code'] == 1001:
    send_file(0,file_size)
  else: # 断点续传
    exist_size = response('size')
    send_file(exist_size,file_size)

sk = socket.socket()
sk.connect(('127.0.0.1',8001))

while 1:
  #upload|文件路径
  user_input = input('命令>>>')
  # 1、自定义协议{'cmd':'upload','file_name':'...'}
  cmd,file_path = user_input.split('|',maxsplit=1)
  if cmd == 'upload':
    upload(file_path)
  elif cmd == 'download':
    pass

服务端示例:

import socketserver
import json
import os
import shutil

CODE = {
  '1001':'重新上传文件'
}

def upload(cmd_dict,conn,username):
  '''服务端完成上传文件(含断点续传)'''
  # 2.获取文件信息
  file_md5 = cmd_dict['md5']
  file_name = cmd_dict['file_name']
  file_md5_path = os.path.join('home', username, file_md5)
  file_name_path = os.path.join('home', username, file_name)
  upload_file_size = cmd_dict['size']

  # 3.判断文件是否存在
  exist = os.path.exists(file_md5_path)
  if not exist: # 不续传
    # 3.1.1通知可以开始上传,已经准备好
    response = {'code': 1001}
    conn.sendall(json.dumps(response).encode('utf8'))

    # 3.1.2接收上传的文件内容
    f = open(file_md5_path, 'wb')
    recv_size = 0
    while recv_size < upload_file_size:
      data = conn.recv(1024)
      f.write(data) # 写到内存
      f.flush() # 刷到硬盘
      recv_size += len(data)
    f.close()

    # 3.1.3改文件名
    shutil.move(file_md5_path, file_name_path)

  else: # 存在就续传
    # 3.2续传 + 大小
    exist_size = os.stat(file_md5_path).st_size
    response = {'code': 1002, 'size': exist_size}
    conn.sendall(json.dumps(response).encode('utf8'))

    f = open(file_md5_path, 'ab')
    recv_size = exist_size
    while recv_size < upload_file_size:
      data = conn.recv(1024)
      f.write(data) # 写到内存
      f.flush() # 刷到硬盘
      recv_size += len(data)
    f.close()

    # 3.1.3改文件名
    shutil.move(file_md5_path, file_name_path)


class NBServer(socketserver.BaseRequestHandler):
  def handle(self):
    '''self.request是请求客户端的socket对象'''

    #1.接受命令
    upload_cmd_bytes = self.request.recv(8096)
    cmd_dict = json.loads(upload_cmd_bytes.decode('utf8'))

    if cmd_dict['cmd'] == 'upload':
      upload(cmd_dict,self.request,'zhangzijian')
    elif cmd_dict['cmd'] == 'download':
      pass

if __name__ == '__main__':
  server = socketserver.ThreadingTCPServer(('127.0.0.1',8001),NBServer)
  server.serve_forever()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础语法(Python基础知识点)
Feb 28 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
python Flask实现restful api service
Dec 04 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python制作朋友圈九宫格图片
Nov 03 Python
python实现小世界网络生成
Nov 21 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 #Python
在vscode中配置python环境过程解析
Sep 28 #Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 #Python
python 单线程和异步协程工作方式解析
Sep 28 #Python
python爬虫 正则表达式解析
Sep 28 #Python
python爬虫 Pyppeteer使用方法解析
Sep 28 #Python
python安装scipy的步骤解析
Sep 28 #Python
You might like
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
Python help()函数用法详解
2014/03/11 Python
Python中bisect的用法
2014/09/23 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python温度转换实例分析
2018/01/17 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
Python安装selenium包详细过程
2019/07/23 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
运动会获奖感言
2014/02/11 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
置业顾问岗位职责
2015/02/09 职场文书
大学生求职信怎么写
2015/03/19 职场文书
《青山不老》教学反思
2016/02/22 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL