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使用xmlrpc实例讲解
Dec 17 Python
django+js+ajax实现刷新页面的方法
May 22 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
Django组件之cookie与session的使用方法
Jan 10 Python
python实现动态数组的示例代码
Jul 15 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
Python属性和内建属性实例解析
Jan 14 Python
python的列表List求均值和中位数实例
Mar 03 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
python中执行smtplib失败的处理方法
Jul 01 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Pandas搭配lambda组合使用详解
Jan 22 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邮件类
2007/01/03 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
js同比例缩放图片的小例子
2013/10/30 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
面包屑导航详解
2017/12/07 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python开根号实例讲解
2020/08/30 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
经贸日语专业个人求职信范文
2013/12/28 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
公司任命书模板
2014/06/06 职场文书
机电系毕业生求职信
2014/07/11 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
javascript对象3个属性特征
2021/11/17 Javascript