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中的type()方法的使用
May 21 Python
基于Python的关键字监控及告警
Jul 06 Python
python版学生管理系统
Jan 10 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
详解Anaconda 的安装教程
Sep 23 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
python人工智能human learn绘图可创建机器学习模型
Nov 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 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python实现kMeans算法
2017/12/21 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
python中提高pip install速度
2020/02/14 Python
python实现打砖块游戏
2020/02/25 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
餐饮加盟计划书
2014/01/10 职场文书
大学活动策划书范文
2014/01/10 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
初一语文教学反思
2016/03/03 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android