python实现文件分片上传的接口自动化
作者:杨佳啊 发布时间:2022-06-29 03:39:41
标签:python,上传
背景和目的:
利用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值,判断是否正确
来源:https://blog.csdn.net/weapon_host/article/details/108186803
0
投稿
猜你喜欢
- 1、爬取网页分析爬取的目标网址为:https://www.gushiwen.cn/在登陆界面需要做的工作有,获取验证码图片,并识别该验证码,
- 本文只考虑模板中的字符串,不考虑字符串中带标签的情况。模板中的字符串文字不会自动转义,因为这里默认模板的作者已经正确书写模板的内容。{{ d
- 本文研究的主要是Python生成器及其应用,具体如下。一、定义可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调
- 脚本1:这两天用python写了一个删除指定目录下过期时间的脚本。也可能是我初学python,对python还不够熟习,总觉得这个脚本用sh
- open 遍历一个大日志文件使用 readlines() 还是 readline() ?总体上 readlines() 不慢于python
- 本人电脑上的Python为3.5,安装在Windows上,虽然安装过程中选择了pip,但是在命令行输入pip后仍然不能成功,尝试一下方法,终
- 函数描述int(x [,base])将x转换为一个整数long(x [,base] )将x转换为一个长整数float(x)将x转换到一个浮点
- 1、应该将 CSS 放置于结构的上方(一般放置于 head 元素内)。CSS 是解释型语言,Firefox 和 IE 在等待 CSS 传输完
- 本文以Python开发为例来进行说明,环境说明:(1) Python 3.x(我用的版本是 3.9 版本)(2)IDE开具 PyCharm(
- (1)安装Jpype 用Python调用jar包需要安装jpype扩展,在Ubuntu上可以直接使用apt-get安装jpype扩展$ su
- 作者: Terrance译者:Sheneyan(子乌)时间:2010.2.6英文原文:13 Useful WordPress SQL Que
- 任何一个行业里,当有一头近乎垄断的大象盘踞着的时候,生活在大象身后的蚂蚁们既是悲哀又是幸运的。悲哀的是市场已近乎被大象垄断留给他们的空间已经
- 本文实例为大家分享了Django实现上传图片的具体代码,供大家参考,具体内容如下1.设置存放上传的图片的文件夹settings.pyMEDI
- 1、什么是水仙花数?水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digit
- 本文中介绍的系统优化,主要针对前端和后台这两方面(后台方面主要对SQL语句和数据存储进行了优化),下文中我们将介绍一些优化技巧和经验。技巧:
- 传入参数一个,为元素的id值或元素本身,返回为元素的真实背景色值(字符串)。 值得一提的是IE里面返回的是16进制的值,而Mozi
- Oracle中有多种方法可以向数据库或服务器文件系统上载文件,这里主要介绍如下三种:Oracle HTTP Server(OHS)的mod_
- 很多人在使用AJAX调用别人站点内容的时候,JS会提示"没有权限"错误,这是XMLHTTP组件的限制-安全起见禁止访问非
- 把下面SQL里的SELECT单独执行,没有问题,但是用来CREATE VIEW 就报错了.CREATE OR REPLA
- 一、安装插件要生成html类型的报告,需要使用pytest-html插件,可以在IDE中安装,也可以在命令行中安装。插件安装的位置涉及到不同