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编程过程中用单元测试法调试代码的介绍
Apr 02 Python
Python探索之SocketServer详解
Oct 28 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
python安装requests库的实例代码
Jun 25 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python获取引用对象的个数方式
Dec 20 Python
python with语句的原理与用法详解
Mar 30 Python
python如何建立全零数组
Jul 19 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
pytorch 使用半精度模型部署的操作
May 24 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
我的论坛源代码(九)
2006/10/09 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
使用python实现tcp自动重连
2017/07/02 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python支付宝支付示例详解
2019/08/22 Python
Python文件路径名的操作方法
2019/10/30 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Python日志处理模块logging用法解析
2020/05/19 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
老师给学生的表扬信
2014/01/17 职场文书
军神教学反思
2014/02/04 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP