python实现文件分片上传的接口自动化

 更新时间:2020-11-19 17:00:39   作者:佚名   我要评论(0)

背景和目的:


利用python request 编写脚本测试公司系统的文件上传接口。前端读取文件的大小然后文件分片传给后端,后端将每一片数据重新组合成文件。大概的过程

背景和目的:

利用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实现一个简单的能够上传下载的HTTP服务器
  • python 实现上传图片并预览的3种方法(推荐)
  • python实现支持目录FTP上传下载文件的方法
  • python实现上传下载文件功能
  • Python使用Flask框架同时上传多个文件的方法
  • Python selenium文件上传方法汇总
  • python实现的简单FTP上传下载文件实例
  • python使用paramiko模块实现ssh远程登陆上传文件并执行
  • Python使用百度API上传文件到百度网盘代码分享
  • Python+django实现文件上传

相关文章

  • python实现文件分片上传的接口自动化

    python实现文件分片上传的接口自动化

    背景和目的: 利用python request 编写脚本测试公司系统的文件上传接口。前端读取文件的大小然后文件分片传给后端,后端将每一片数据重新组合成文件。大概的过程
    2020-11-19
  • Python爬虫如何破解JS加密的Cookie

    Python爬虫如何破解JS加密的Cookie

      通过Fiddler抓包比较,基本可以确定是JavaScript生成加密Cookie导致原来的请求返回521。 发现问题:   打开Fiddler软件,用浏览器打开目标站点(http://www.ku
    2020-11-19
  • Python并发爬虫常用实现方法解析

    Python并发爬虫常用实现方法解析

    在进行单个爬虫抓取的时候,我们不可能按照一次抓取一个url的方式进行网页抓取,这样效率低,也浪费了cpu的资源。目前python上面进行并发抓取的实现方式主要有以下几
    2020-11-19
  • Python类class参数self原理解析

    Python类class参数self原理解析

    1.self只有在类的方法中才会有,其他函数或方法是不必带self的。 2.在调用时不必传入相应的参数。 3.在类的方法中(如__init__),第一参数永远是self,表示创
    2020-11-19
  • vue-drawer-layout实现手势滑出菜单栏

    vue-drawer-layout实现手势滑出菜单栏

    本文实例为大家分享了vue-drawer-layout实现手势滑出菜单栏的具体代码,供大家参考,具体内容如下 文档链接地址 安装 npm install vue-drawer-layout --save ma
    2020-11-19
  • JavaScript实现无限轮播效果

    JavaScript实现无限轮播效果

    本文实例为大家分享了JavaScript实现无限轮播效果的具体代码,供大家参考,具体内容如下 效果展示 原理 图片说明原理 轮播顺序:1–>2–>3–>4–>5–>1的副本–>2
    2020-11-19
  • php操作redis命令及代码实例大全

    php操作redis命令及代码实例大全

    官方PHP Redis扩展文件下载 https://pecl.php.net/package/redis 选择与你PHP版本相应的文件下载后直接放到PHP目录下的ext文件夹里,然后修改php.ini配置文件如下
    2020-11-19
  • 如何用SpringBoot 进行测试

    如何用SpringBoot 进行测试

    普通测试 假设要测试一个工具类 StringUtil(com.rxliuli.example.springboottest.util.StringUtil) /** * 用于测试的字符串工具类 * * @author rxliuli
    2020-11-19
  • Java彻底消灭if-else的8种方案

    Java彻底消灭if-else的8种方案

    优化方案 1:提前 return,去除不必要的 else 如果 if-else 代码块包含 return 语句,可以考虑通过提前 return,把多余 else 干掉,使代码更加优雅。 优化前: if
    2020-11-19
  • 微信小程序实现分页加载效果

    微信小程序实现分页加载效果

    分页加载功能大家遇到的应该会经常遇到,应用场景也很多,例如微博,QQ,微信朋友圈以及新闻类应用,都会有分页加载的功能,这不仅节省了我们用户的流量,还提升了用
    2020-11-19

最新评论