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中的对象,方法,类,实例,函数用法分析
Jan 15 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
Python如何实现守护进程的方法示例
Feb 08 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
python中对_init_的理解及实例解析
Oct 11 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
python实现视频压缩功能
Dec 18 Python
Python 图片处理库exifread详解
Feb 25 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
PHP分页效率终结版(推荐)
2013/07/01 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
详谈javascript异步编程
2016/02/21 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
利用Python检测URL状态
2019/07/31 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
2014婚礼司仪主持词
2014/03/14 职场文书
小区推广策划方案
2014/06/06 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
社团活动总结格式
2014/08/29 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
邀请函样本
2015/02/02 职场文书
司机岗位职责
2015/02/04 职场文书
银行自荐信怎么写
2015/03/05 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python