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 相关文章推荐
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
python3中int(整型)的使用教程
Mar 23 Python
python实现堆和索引堆的代码示例
Mar 19 Python
简单实现python聊天程序
Apr 01 Python
python 接收处理外带的参数方法
Dec 03 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
Python urllib2运行过程原理解析
Jun 04 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 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/05 新手入门
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JS继承用法实例分析
2015/02/05 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
详解在Python程序中自定义异常的方法
2015/10/16 Python
python3大文件解压和基本操作
2017/12/15 Python
一道python走迷宫算法题
2018/01/22 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
Django框架模板介绍
2019/01/15 Python
Django logging配置及使用详解
2019/07/23 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
新学期教师寄语
2014/04/02 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书