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的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
Python随机函数random()使用方法小结
Apr 29 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
Python web如何在IIS发布应用过程解析
May 27 Python
python中sys模块是做什么用的
Aug 16 Python
如何基于Python实现word文档重新排版
Sep 29 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
Knockoutjs的环境搭建教程
2012/11/26 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python第三方库的安装方法总结
2016/06/06 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
大学生的网上创业计划书
2013/12/31 职场文书
五年级科学教学反思
2014/02/05 职场文书
家属答谢词
2015/01/05 职场文书
演讲比赛主持词
2015/06/29 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python