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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
快速了解python leveldb
Jan 18 Python
Django中的Model操作表的实现
Jul 24 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
python切割图片的示例
Nov 12 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修改NetBeans默认字体的大小
2013/07/02 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
Python多线程和队列操作实例
2015/06/21 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
商场消防管理制度
2014/01/12 职场文书
承诺书范本
2015/01/21 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
500字作文之周记
2019/12/13 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript