Python之requests模块-大文件分片上传
最近在做接口测试时,拿到一个分片上传文件的接口,http接口请求头中的Content-Type为multipart/form-data。需要在客户端将大文件分片成数据块后,依次传给服务端,由服务端还原成大文件,此外,为了确保传输后的数据是完整的,客户端会在分片前,根据原文件生成md5值并被携带在每次的http请求中,服务端在还原文件后会进行校验。
如何使用requests模块,实现上述接口测试的需求呢?首先,需要将问题分解:
- requests如何传输Content-Type为multipart/form-data的数据?
- 如何根据原文件生成md5值?
- 如何将大文件分片成数据块?
本文将逐一为大家解答。
发送multipart/form-data请求
这里需要用到辅助库requests_toolbelt,使用MultipartEncoder类创建一个multipart/form-data类型的data充当请求体。此外,我们请求头中的Content-Type除了multipart/form-data还需生成boundary,如下例所示:
import requests
from requests_toolbelt import MultipartEncoder
import os def upload_multipart(url, file_path):
filename = file_path.split("\\")[-1:][0]
total_size = os.path.getsize(file_path)
data = MultipartEncoder(
fields={
"filename": filename,
"totalSize": str(total_size),
"file": (filename, open(file_path, 'rb'), 'application/octet-stream')
}
)
headers = {
"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",
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Content-Type": data.content_type
}
with requests.post(url, headers=headers, data=data) as response:
assert response.status_code == 200
根据原文件生成md5值
使用hashlib库,如下例所示:
import hashlib def get_md5(path):
m = hashlib.md5()
with open(path, 'rb') as f:
for line in f:
m.update(line)
md5code = m.hexdigest()
return md5code
大文件分片成数据块
如下例所示,定义数据块的大小为2MB,根据文件大小划分出数据块的总数量,通过fileObject.seek()函数偏移文件的指针到当前数据块的位置,依次读取数据块并发送请求,每个请求都带上了md5值。
import requests
from requests_toolbelt import MultipartEncoder
import os
import math def upload_slice_file(url, file_path):
chunk_size = 1024*1024*2
filename = file_path.split("\\")[-1:][0]
total_size = os.path.getsize(file_path)
current_chunk = 1
total_chunk = math.ceil(total_size/chunk_size) while current_chunk <= total_chunk:
start = (current_chunk - 1)*chunk_size
end = min(total_size, start+chunk_size)
with open(file_path, 'rb') as f:
f.seek(start)
file_chunk_data = f.read(end-start)
data = MultipartEncoder(
fields={
"filename": filename,
"totalSize": str(total_size),
"currentChunk": str(current_chunk),
"totalChunk": str(total_chunk),
"md5": get_md5(file_path),
"file": (filename, file_chunk_data, 'application/octet-stream')
}
)
headers = {
"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",
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Content-Type": data.content_type
}
with requests.post(url, headers=headers, data=data) as response:
assert response.status_code == 200 current_chunk = current_chunk + 1
Python之requests模块-大文件分片上传的更多相关文章
- PHP大文件分片上传的实现方法
一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...
- Webuploader 大文件分片上传
百度Webuploader 大文件分片上传(.net接收) 前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片 ...
- java springboot 大文件分片上传处理
参考自:https://blog.csdn.net/u014150463/article/details/74044467 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时 ...
- vue+大文件分片上传
最近公司在使用vue做工程项目,实现大文件分片上传. 网上找了一天,发现网上很多代码都存在很多问题,最后终于找到了一个符合要求的项目. 工程如下: 对项目的大文件上传功能做出分析,怎么实现大文件分片上 ...
- iOS大文件分片上传和断点续传
总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...
- js实现大文件分片上传的方法
借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData 对象的使用Blob 对象的使用以下是实现代码, ...
- Node + js实现大文件分片上传基本原理及实践(一)
_ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...
- thinkphp+webuploader实现大文件分片上传
大文件分片上传,简单来说就是把大文件切分为小文件,然后再一个一个的上传,到最后由这些小文件再合并成原来的文件 webuploader下载地址及其文档:http://fex.baidu.com/webu ...
- 在React中使用WebUploader实现大文件分片上传的踩坑日记!
前段时间公司项目有个大文件分片上传的需求,项目是用React写的,大文件分片上传这个功能使用了WebUploader这个组件. 具体交互是: 1. 点击上传文件button后出现弹窗,弹窗内有选择文件 ...
随机推荐
- Intouch 制作自定义登录弹窗
在新的自动化项目中,因为业主对设计审美要求比较高,对Intouch自带脚本呼出登录窗体不满意,故而制作自定义登录弹窗来满足其审美需求.在寻求自控群前辈的经验下,将其整理成博客,供大家参考. 1.登录窗 ...
- DC-7靶机
仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-7.zip 一.主机扫描 二.信息收集 或者 python3 cmseek.py --url h ...
- 判断Windows系统是32位或64位并执行不同脚本命令
判断Windows系统是32位或64位并执行不同脚本命令 https://www.autoahk.com/?p=16549&preview=true https://www.cnblogs.c ...
- 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了
最近我们项目升级到了 Spring Boot 2.4.6 + Spring Cloud 2020.0.x,通过我的另一系列即可看出:Spring Cloud 升级之路.但是升级后,我们发现 Young ...
- jdk、jre环境变量配置
1 jdk和jre的区别: (jdk:Java 开发工具包) (jre:Java 的运行环境) 只需这么记就可以了,想深入了解得自行查询相关资料 2 jdk是包含jre的,所以只需下载jdk. 官方网 ...
- Git-05-文件删除与恢复
删除文件 1 添加一个文件test.txt文件用于测试 2 删除文件,这样删除,工作区和版本库一致 也可以直接rm 然后在 git rm,git commit 这样也能保证工作区和版本库一致 恢复误删 ...
- Sqli-Labs less8-10
less-8 前置基础知识: 前几关我们用到了布尔盲注的办法,还有一种盲注就是时间盲注,不仅可以用于有回显的盲注,还能用于没有回显的盲注 函数:sleep(1):等待1秒之后再返回页面做出反应 IF( ...
- STM32—SPI读写FLASH
目录 FLASH简介 W25Q64 W25Q64简介 FLASH控制指令 FLASH内部存储结构 代码讲解 读取芯片ID 发送写使能信号 等待FLASH不忙 擦除扇区 写入数据 读取数据 注 FLAS ...
- SQL 练习31
查询任何一门课程成绩在 70 分以上的姓名.课程名称和分数 SELECT Sname,cname,Course.CId,SC.score from Student,Course,sc WHERE St ...
- NOIP 模拟 $29\; \rm 完全背包问题$
题解 \(by\;zj\varphi\) 一道 \(\rm dp\) 题. 现将所有种类从小到大排序,然后判断,若最小的已经大于了 \(\rm l\),那么直接就是一个裸的完全背包,因为选的总数量有限 ...