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使用cookie库操保存cookie详解
Mar 03 Python
Python实现通讯录功能
Feb 22 Python
python将秒数转化为时间格式的实例
Sep 16 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
Aug 09 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Python3搭建http服务器的实现代码
Feb 11 Python
python代码xml转txt实例
Mar 10 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python Parser的用法
May 12 Python
Python字符串常规操作小结
Apr 03 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
编写PHP的安全策略
2006/10/09 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
yii分页组件用法实例分析
2015/12/28 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
政府法律服务方案
2014/06/14 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
化妆品促销活动总结
2015/05/07 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书