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使用MONGODB入门实例
May 11 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
python实现自动发送邮件
Jun 20 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
python获取服务器响应cookie的实例
Dec 28 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
python入门之井字棋小游戏
Mar 05 Python
Python自省及反射原理实例详解
Jul 06 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 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/03/16 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
Python MD5文件生成码
2009/01/12 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Python通过socketserver处理多个链接
2020/03/18 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
大学生旅游业创业计划书
2014/01/29 职场文书
大学生新学期计划书
2014/04/28 职场文书
装配出错检讨书
2014/09/23 职场文书
运动会加油稿20字
2014/11/15 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
500字作文之周记
2019/12/13 职场文书
Python 多线程处理任务实例
2021/11/07 Python
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers