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类继承用法实例分析
May 27 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Django框架验证码用法实例分析
May 10 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
Python实现微信机器人的方法
Sep 06 Python
用Python生成HTML表格的方法示例
Mar 06 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
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的FTP学习(四)
2006/10/09 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
python selenium firefox使用详解
2019/02/26 Python
python config文件的读写操作示例
2019/09/27 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
神路信息Java面试题目
2013/03/31 面试题
小学趣味运动会加油稿
2014/09/25 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
学校食品安全责任书
2015/01/29 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏