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基础教程之类class定义使用方法
Feb 20 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
Django 重写用户模型的实现
Jul 29 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
Python二次规划和线性规划使用实例
Dec 09 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
Python datetime模块使用方法小结
Jun 18 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
Sep 20 Python
python基础入门之字典和集合
Jun 13 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python实现装饰器、描述符
2018/02/28 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
财产保全担保书范文
2014/04/01 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
员工升职自荐信
2015/03/27 职场文书
个人道歉信大全
2019/04/11 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python
JavaScript 反射学习技巧
2021/10/16 Javascript
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS