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链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
python实现NB-IoT模块远程控制
Jun 20 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
浅谈python标准库--functools.partial
Mar 13 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
python字符串反转的四种方法详解
Dec 02 Python
Python for循环与getitem的关系详解
Jan 02 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python3搭建http服务器的实现代码
Feb 11 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
教你用python实现一个无界面的小型图书管理系统
May 21 Python
pytorch 实现变分自动编码器的操作
May 24 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+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
Python中的Numpy入门教程
2014/04/26 Python
python测试驱动开发实例
2014/10/08 Python
python使用turtle绘制分形树
2018/06/22 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
django删除表重建的实现方法
2019/08/28 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
初中生自我评价
2014/02/01 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
中班开学寄语
2014/04/04 职场文书
大学生社会实践评语
2014/04/25 职场文书
国庆庆典邀请函
2015/02/02 职场文书
稽核岗位职责
2015/02/10 职场文书
单位病假条范文
2015/08/17 职场文书
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
python创建字典及相关管理操作
2022/04/13 Python
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android