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检测网页是否有日常链接
Jun 03 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python实现的递归神经网络简单示例
Aug 11 Python
通过Python实现自动填写调查问卷
Sep 06 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
Python上下文管理器用法及实例解析
Nov 11 Python
python通过移动端访问查看电脑界面
Jan 06 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
Python中Qslider控件实操详解
Feb 20 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
解析MySql与Java的时间类型
2013/06/22 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
初学Python函数的笔记整理
2015/04/07 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
满月酒答谢词
2014/01/14 职场文书
初中班主任评语大全
2014/04/24 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB