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中的闭包
Nov 30 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
详解Python之unittest单元测试代码
Jan 24 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
Python实现Singleton模式的方式详解
Aug 08 Python
详解python statistics模块及函数用法
Oct 27 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
Python logging模块原理解析及应用
Aug 13 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 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获取表单中多个同名input元素的值
2014/03/20 PHP
详解YII关联查询
2016/01/10 PHP
可编辑下拉框的2种实现方式
2014/06/13 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
Javascript中replace()小结
2015/09/30 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
详解flask入门模板引擎
2018/07/18 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
一道Delphi面试题
2016/10/28 面试题
印刷工程专业应届生求职信
2013/09/29 职场文书
商务英语广告词大全
2014/03/18 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
党员作风建设整改方案
2014/10/27 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
Python 匹配文本并在其上一行追加文本
2022/05/11 Python