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 = size(dat['path']) # 获取⽂件的⼤⼩
< = 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:
d5(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 = d5(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类型时,要像下⾯⼀样构建参数,不然会有错误python怎么读取dat文件
files={
'chunk':('blob',data,'application/octet-stream'),
'name':(None,self.name),
'ext':(),
'index':(None,chunkIndex),
'total': (alchunk),
'size': (None,self.size),
'chunk_md5': (None,chunk_md5),
'md5': (None,MD5),
}
# 使⽤requests发送接⼝请求
res = quest.send('post', '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值,判断是否正确
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论