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 文件和输入输出小结
Oct 09 Python
分享15个最受欢迎的Python开源框架
Jul 13 Python
Python生成验证码实例
Aug 21 Python
详解python的ORM中Pony用法
Feb 09 Python
Python编写一个优美的下载器
Apr 15 Python
python地震数据可视化详解
Jun 18 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
python性能测量工具cProfile使用解析
Sep 26 Python
Python列表元素常见操作简单示例
Oct 25 Python
Python实现寻找回文数字过程解析
Jun 09 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
Python基于Faker假数据构造库
Nov 30 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自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
vuex实现购物车功能
2020/06/28 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
Python中random模块生成随机数详解
2016/03/10 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python pandas 时间日期的处理实现
2019/07/30 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
python mock测试的示例
2020/10/19 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
简历的个人自我评价范文
2014/01/03 职场文书
2014升学宴答谢词
2014/01/26 职场文书
交通安全学习心得体会
2016/01/18 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
QT与javascript交互数据的实现
2021/05/26 Javascript
HTML中的表格元素介绍
2022/02/28 HTML / CSS
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android