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 正则式 概述及常用字符
May 07 Python
python通过scapy获取局域网所有主机mac地址示例
May 04 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python简单生成8位随机密码的方法
May 24 Python
Python之re操作方法(详解)
Jun 14 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
深入了解Python enumerate和zip
Jul 16 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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之Smarty入门
2007/01/04 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
jquery 选择器部分整理
2009/10/28 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
小学教师学期末自我评价
2013/09/25 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
班级年度安全计划书
2014/05/01 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
工作自我推荐信范文
2015/03/25 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
解析MySQL binlog
2021/06/11 MySQL
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android