背景和目的:
利用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值,判断是否正确
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍bootstrapfileinput实现文件自动上传,包括了bootstrapfileinput实现文件自动上传的使用技巧和注意事项,需要的朋友参考一下 bootstrap fileinput文件上传插件功能如此强大,样式非常美观,并且支持上传文件预览,ajax同步或异步上传,拖曳文件上传等炫酷的功能,完全没有理由不去使用, JS引用: HTML: <input id="fileUp
本文向大家介绍Python接口自动化测试的实现,包括了Python接口自动化测试的实现的使用技巧和注意事项,需要的朋友参考一下 1)环境准备: 接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当工具不太适合项目时需要自己进行开发。 在我们项目
本文向大家介绍python+requests接口自动化框架的实现,包括了python+requests接口自动化框架的实现的使用技巧和注意事项,需要的朋友参考一下 为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离;数据的变更不影响程序 3、有日志功能,实现无人值守 4、自动发送测试报告 5、不懂编程的测试人员也可以进行测试 正常接口测试的流程是什么? 确定接口测试使用的工具--
本文向大家介绍js控件Kindeditor实现图片自动上传功能,包括了js控件Kindeditor实现图片自动上传功能的使用技巧和注意事项,需要的朋友参考一下 Kindeditor是一款功能强大的开源在线HTML编辑器,支持所见即所得的编辑效果。它使用JavaScript编写,可以无缝地与多个不同的语言环境进行集成,如.NET、PHP、ASP、Java等。官方网站可以查看这里:http://kin
本文向大家介绍Vue.Js及Java实现文件分片上传代码实例,包括了Vue.Js及Java实现文件分片上传代码实例的使用技巧和注意事项,需要的朋友参考一下 说明 代码从项目中剥离修改,未经测试,仅提供思路。 前端 文件分片上传的前端关键代码只有一句: //切割文件 var chunk = file.slice(start, end); 通过slice方法来切割文件,然后文件上传的流程视业务和具体技
本文向大家介绍ajax异步实现文件分片上传实例代码,包括了ajax异步实现文件分片上传实例代码的使用技巧和注意事项,需要的朋友参考一下 前言 使用Ajax上传文件的应用场景颇多,比如上传用户头像、博客文章中插入图片、对认证用户相关身份进行校验等等很多很多。这篇文章主要介绍了关于ajax异步实现文件分片上传的相关内容,下面话不多说了,来一起看看详细的介绍吧 实例代码: 总结 到此这篇关于ajax异步