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利用hook技术破解https的实例代码
Mar 25 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
Django ValuesQuerySet转json方式
Mar 16 Python
django使用多个数据库的方法实例
Mar 04 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函数)
2006/10/09 PHP
php设计模式之委托模式
2016/02/13 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
Laravel实现表单提交
2017/05/07 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
js以对象为索引的关联数组
2010/07/04 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
javascript通过class来获取元素实现代码
2013/02/20 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python如何使用代码运行助手
2020/07/03 Python
Java程序员面试题
2013/07/15 面试题
经典的班主任推荐信
2013/10/28 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
英文请假条
2014/04/11 职场文书
个人收入证明模板
2014/09/18 职场文书
工会工作个人总结
2015/03/03 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android