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 threading多线程编程实例
Sep 18 Python
Python切片知识解析
Mar 06 Python
python正则分析nginx的访问日志
Jan 17 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
python破解zip加密文件的方法
May 31 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 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
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
理解javascript对象继承
2016/04/17 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Python内置数据类型详解
2014/08/18 Python
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
python中管道用法入门实例
2015/06/04 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Python变量作用范围实例分析
2015/07/07 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
python绘制汉诺塔
2021/03/01 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
打架检讨书100字
2014/01/19 职场文书
母亲节感恩寄语
2014/02/21 职场文书
生产文员岗位职责
2014/04/05 职场文书
毕业生面试求职信
2014/06/23 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书