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两个整数相除得到浮点数值的方法
Mar 18 Python
Python使用minidom读写xml的方法
Jun 03 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
Python 面试中 8 个必考问题
Nov 16 Python
对python3中, print横向输出的方法详解
Jan 28 Python
Python同步遍历多个列表的示例
Feb 19 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
pandas如何处理缺失值
Jul 31 Python
Python 线程池用法简单示例
Oct 02 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
python3跳出一个循环的实例操作
Aug 18 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
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
vue router demo详解
2017/10/13 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
基于python实现名片管理系统
2018/11/30 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
安全事故检讨书
2014/01/18 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
揭牌仪式主持词
2014/03/19 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
员工手册编写范本
2015/05/14 职场文书
初中物理教学反思
2016/02/19 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
golang生成并解析JSON
2022/04/14 Golang
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python