最近在做接口测试时,拿到一个分片上传文件的接口,http接口请求头中的Content-Type为multipart/form-data。需要在客户端将大文件分片成数据块后,依次传给服务端,由服务端还原成大文件,此外,为了确保传输后的数据是完整的,客户端会在分片前,根据原文件生成md5值并被携带在每次的http请求中,服务端在还原文件后会进行校验。

如何使用requests模块,实现上述接口测试的需求呢?首先,需要将问题分解:

  1. requests如何传输Content-Type为multipart/form-data的数据?
  2. 如何根据原文件生成md5值?
  3. 如何将大文件分片成数据块?

本文将逐一为大家解答。

发送multipart/form-data请求

这里需要用到辅助库requests_toolbelt,使用MultipartEncoder类创建一个multipart/form-data类型的data充当请求体。此外,我们请求头中的Content-Type除了multipart/form-data还需生成boundary,如下例所示:

  1. import requests
  2. from requests_toolbelt import MultipartEncoder
  3. import os
  4.  
  5. def upload_multipart(url, file_path):
  6. filename = file_path.split("\\")[-1:][0]
  7. total_size = os.path.getsize(file_path)
  8. data = MultipartEncoder(
  9. fields={
  10. "filename": filename,
  11. "totalSize": str(total_size),
  12. "file": (filename, open(file_path, 'rb'), 'application/octet-stream')
  13. }
  14. )
  15. headers = {
  16. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
  17. "Accept": "application/json",
  18. "Accept-Encoding": "gzip, deflate",
  19. "Connection": "keep-alive",
  20. "Content-Type": data.content_type
  21. }
  22. with requests.post(url, headers=headers, data=data) as response:
  23. assert response.status_code == 200

根据原文件生成md5值

使用hashlib库,如下例所示:

  1. import hashlib
  2.  
  3. def get_md5(path):
  4. m = hashlib.md5()
  5. with open(path, 'rb') as f:
  6. for line in f:
  7. m.update(line)
  8. md5code = m.hexdigest()
  9. return md5code

大文件分片成数据块

如下例所示,定义数据块的大小为2MB,根据文件大小划分出数据块的总数量,通过fileObject.seek()函数偏移文件的指针到当前数据块的位置,依次读取数据块并发送请求,每个请求都带上了md5值。

  1. import requests
  2. from requests_toolbelt import MultipartEncoder
  3. import os
  4. import math
  5.  
  6. def upload_slice_file(url, file_path):
  7. chunk_size = 1024*1024*2
  8. filename = file_path.split("\\")[-1:][0]
  9. total_size = os.path.getsize(file_path)
  10. current_chunk = 1
  11. total_chunk = math.ceil(total_size/chunk_size)
  12.  
  13. while current_chunk <= total_chunk:
  14. start = (current_chunk - 1)*chunk_size
  15. end = min(total_size, start+chunk_size)
  16. with open(file_path, 'rb') as f:
  17. f.seek(start)
  18. file_chunk_data = f.read(end-start)
  19. data = MultipartEncoder(
  20. fields={
  21. "filename": filename,
  22. "totalSize": str(total_size),
  23. "currentChunk": str(current_chunk),
  24. "totalChunk": str(total_chunk),
  25. "md5": get_md5(file_path),
  26. "file": (filename, file_chunk_data, 'application/octet-stream')
  27. }
  28. )
  29. headers = {
  30. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
  31. "Accept": "application/json",
  32. "Accept-Encoding": "gzip, deflate",
  33. "Connection": "keep-alive",
  34. "Content-Type": data.content_type
  35. }
  36. with requests.post(url, headers=headers, data=data) as response:
  37. assert response.status_code == 200
  38.  
  39. current_chunk = current_chunk + 1

Python之requests模块-大文件分片上传的更多相关文章

  1. PHP大文件分片上传的实现方法

    一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...

  2. Webuploader 大文件分片上传

    百度Webuploader 大文件分片上传(.net接收)   前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片 ...

  3. java springboot 大文件分片上传处理

    参考自:https://blog.csdn.net/u014150463/article/details/74044467 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时 ...

  4. vue+大文件分片上传

    最近公司在使用vue做工程项目,实现大文件分片上传. 网上找了一天,发现网上很多代码都存在很多问题,最后终于找到了一个符合要求的项目. 工程如下: 对项目的大文件上传功能做出分析,怎么实现大文件分片上 ...

  5. iOS大文件分片上传和断点续传

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  6. js实现大文件分片上传的方法

    借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData 对象的使用Blob 对象的使用以下是实现代码, ...

  7. Node + js实现大文件分片上传基本原理及实践(一)

    _ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...

  8. thinkphp+webuploader实现大文件分片上传

    大文件分片上传,简单来说就是把大文件切分为小文件,然后再一个一个的上传,到最后由这些小文件再合并成原来的文件 webuploader下载地址及其文档:http://fex.baidu.com/webu ...

  9. 在React中使用WebUploader实现大文件分片上传的踩坑日记!

    前段时间公司项目有个大文件分片上传的需求,项目是用React写的,大文件分片上传这个功能使用了WebUploader这个组件. 具体交互是: 1. 点击上传文件button后出现弹窗,弹窗内有选择文件 ...

随机推荐

  1. 快速设置 JAVA_HOME

    快速设置 JAVA_HOME %SystemRoot%\System32\rundll32.exe sysdm.cpl,EditEnvironmentVariables

  2. ifix 自动化(Automation)错误弹窗的解决方案

    在先前ifix项目中添加了语音模块,然后概率性跳出自动化(Automation)错误弹窗,先前分析了很多种原因,从代码的冗余,编码等角度进行了优化,效果不是很理想,仍然会概率性出现.经过反反复复大约3 ...

  3. mysql查看当前连接数

    show status like 'Threads%';   需要root权限才能看到所有的连接

  4. DC-9靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-9.zip 一.主机扫描 二.信息收集 三.漏洞查找和利用 发现search的地方可能有sql注 ...

  5. linux对拍

    转自 hzoi-fengwu :https://www.cnblogs.com/hzoi-fengwu/p/14872962.html 1 #include<bits/stdc++.h> ...

  6. pwnable.kr之unlink

    pwnable.kr之unlink 之前在看别的东西,学习的随笔也没有写完......颓了几天. 由于最近在看堆,就把pwnable.kr上unlink这道题做一下,学习一下. 1.程序分析 #inc ...

  7. XCTF-open-source

    下载附件拿到源码. #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { if ( ...

  8. Android程序员提加薪被拒,刷2000题跳槽涨薪50%!

    为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...

  9. 深入理解Https如何保证通信安全

    作为一名ABC搬运工,我相信很多人都知道Https,也都知道它是用来保证通信安全的,但是如果你没有深入了解过Https,可能并不知道它是如何保证通信安全的.我也是借着这次机会,和大家分享下我深入了解的 ...

  10. 【Linux】LVM 逻辑卷管理

    LVM - 逻辑卷管理 简介 LVM(Logical Volume Manager), 即逻辑卷管理,是Linux环境下对磁盘分区进行管理的一种机制. 相关名词 PV(physical volume) ...