python实现文件分片上传的接口自动化


Posted in Python onNovember 19, 2020

背景和目的:

利用python request 编写脚本测试公司系统的文件上传接口。前端读取文件的大小然后文件分片传给后端,后端将每一片数据重新组合成文件。大概的过程是:前端将整个文件的md5、size(大小)、name(文件名)、ext(文件后缀)、totalchunk(分片总数)与分片文件的md5、chunk(分片数据),chunkindex(当前分片文件的下标)等传给后台,后台取得这些数据后,通过chunkindex将每一片数据重组,重组完后,进行md5校验,判断文件上传是否成功。我只需要去调用后台的接口,然后判断文件是否上传成功,并且上传没有错误,其他的文件校验就不用去深究。

开发前端使用的是vue,后台使用的是php,要利用python实现对这一接口的调用,那么就先要将前端数据给模拟出来,然后循环去调用接口,将文件分片上传,我的思路大概如下:

1.获取整个文件的大小、名字、后缀、分片总数,定义每片文件的大小:

def __init__(self,data):
  dat = json.loads(data)
  self.path = dat['path'] # 获取文件路径
  self.CHUNK_SIZE = 1024*1024*2 # 定义每片文件的大小
  self.size = os.path.getsize(dat['path']) # 获取文件的大小
  self.totalchunk = math.ceil(self.size / self.CHUNK_SIZE) # 获取文件的分片总数
  self.ext = os.path.basename(dat['path']).split('.').pop() # 获取文件的后缀
  self.name = os.path.basename(dat['path']) # 获取文件的名字

2.获取文件的md5,查看了开发那边的md5算法,利用python实现过程如下:

# 使用hashlib库的md5方法获取指定文件的md5
def getmd5(self,path):
m = hashlib.md5()
with open(path, 'rb') as f:
 for line in f:
  m.update(line)
  md5code = m.hexdigest()
  return md5code

 # 开发那边对md5的算法进行了优化,当文件的大小小于1M时,直接通过getmd5方法去获取文件的md5值;
 # 当文件大于1M时,通过截取整个文件中的某几个片段,然后拼接成一个文件,再去获取其md5值,最后删除这个文件
 def md5(self,path):
  if self.size < 1024 * 1024:
   return self.getmd5(path)
  f = open(path, 'rb')
  f.seek(0, 0)
  data = f.read(2012)
  f.seek(int(self.size / 2) - 1999, 0)
  data += f.read(1999)
  f.seek(-2010, 2)
  data += f.read(2010)
  f.close()
  path = 'D:/copy_' + str(os.path.basename(path))
  f = open(path, 'wb')
  f.write(data)
  f.close()
  val = self.getmd5(path)
  os.remove(path)
  return val

3.调用文件上传的接口

def uploading(self, chunkIndex):
  MD5 = self.md5(self.path) # 整个文件的md5
  start = (chunkIndex - 1) * self.CHUNK_SIZE # 截取文件的起始位置
  end = min(self.size, start + self.CHUNK_SIZE)# 截取文件的结束位置
  f = open(self.path, 'rb')
  f.seek(start)
  data = f.read(end) # 待分片上传的数据
  f.close()
  path1 = 'D:/copy_' + str(os.path.basename(self.path)) # 将该数据保存在本地
  f = open(path1, 'wb')
  f.write(data)
  f.close()
  chunk_md5 = self.md5(path1) # 读取分片上传数据的md5
  # 将所有的数据储存在files字典当中,利用requests的files传输数据
  # 使用requests files类型时,要像下面一样构建参数,不然会有错误
  files={
   'chunk':('blob',data,'application/octet-stream'),
   'name':(None,self.name),
   'ext':(None,self.ext),
   'index':(None,chunkIndex),
   'total': (None,self.totalchunk),
   'size': (None,self.size),
   'chunk_md5': (None,chunk_md5),
   'md5': (None,MD5),
  }
  # 使用requests发送接口请求
  res = self.request.send('post', 'https://10.104.17.222/bank/elements/uploading', verify=False, files=files)
  os.remove(path1) # 删除存在本地的分片文件
  return res.json()

4.循环调用文件上传的接口

chunkIndex = 1
 while chunkIndex <= totalchunk:
 res2 = upload.uploading(chunkIndex)
 chunkIndex += 1

5.从服务器上去读取通过接口上传的文件的md5值,判断是否正确

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现DNS正向查询、反向查询的例子
Apr 25 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
python实现猜数字游戏
Mar 25 Python
python调用接口的4种方式代码实例
Nov 19 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
python实现飞船大战
Apr 24 Python
PyQt5实现简单的计算器
May 30 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
python与js主要区别点总结
Sep 13 Python
python如何在word中存储本地图片
Apr 07 Python
Python类class参数self原理解析
Nov 19 #Python
Python爬虫如何破解JS加密的Cookie
Nov 19 #Python
python制作一个简单的gui 数据库查询界面
Nov 19 #Python
解决python3中os.popen()出错的问题
Nov 19 #Python
Python中return函数返回值实例用法
Nov 19 #Python
python 三种方法实现对Excel表格的读写
Nov 19 #Python
基于python模拟bfs和dfs代码实例
Nov 19 #Python
You might like
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
Python编程之属性和方法实例详解
2015/05/19 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python 互换字典的键值对实例
2019/02/12 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
Python如何使用字符打印照片
2020/01/03 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
小学生新学期寄语
2014/01/19 职场文书
金融管理应届生求职信
2014/02/20 职场文书
市场营销战略计划书
2014/05/06 职场文书
普通话演讲稿
2014/09/03 职场文书
公务员年度考核评语
2014/12/31 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
mysql left join快速转inner join的过程
2021/06/30 MySQL