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 相关文章推荐
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python实现随机选择元素功能
Sep 14 Python
python字符串的方法与操作大全
Jan 30 Python
python Django中models进行模糊查询的示例
Jul 18 Python
使用python制作一个解压缩软件
Nov 13 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
Python新手学习装饰器
Jun 04 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 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递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
php简单smarty入门程序实例
2015/06/11 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
Javascript实现基本运算器
2017/07/15 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
python unittest实现api自动化测试
2018/04/04 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python爬虫开发与项目实战
2020/12/16 Python
英国最大的海报商店:GB Posters
2018/03/20 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
python基础入门之普通操作与函数(三)
2021/06/13 Python
php双向队列实例讲解
2021/11/17 PHP