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设计模式大全
Jun 27 Python
简述Python2与Python3的不同点
Jan 21 Python
Python装饰器用法实例总结
May 26 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
python写日志文件操作类与应用示例
Jul 01 Python
python 读取修改pcap包的例子
Jul 23 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
python中的random模块和相关函数详解
Apr 22 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
prototype1.4中文手册
2006/09/22 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
python实现的各种排序算法代码
2013/03/04 Python
python转换摩斯密码示例
2014/02/16 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Python通过Pillow实现图片对比
2020/04/29 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
公共事业管理本科生求职信
2013/10/07 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
励志演讲稿200字
2014/08/21 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
商场广播稿范文
2015/08/19 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
mysql数据库如何转移到oracle
2022/12/24 MySQL