python實(shí)現(xiàn)文件分片上傳的接口自動(dòng)化
背景和目的:
利用python request 編寫腳本測(cè)試公司系統(tǒng)的文件上傳接口。前端讀取文件的大小然后文件分片傳給后端,后端將每一片數(shù)據(jù)重新組合成文件。大概的過程是:前端將整個(gè)文件的md5、size(大?。?、name(文件名)、ext(文件后綴)、totalchunk(分片總數(shù))與分片文件的md5、chunk(分片數(shù)據(jù)),chunkindex(當(dāng)前分片文件的下標(biāo))等傳給后臺(tái),后臺(tái)取得這些數(shù)據(jù)后,通過chunkindex將每一片數(shù)據(jù)重組,重組完后,進(jìn)行md5校驗(yàn),判斷文件上傳是否成功。我只需要去調(diào)用后臺(tái)的接口,然后判斷文件是否上傳成功,并且上傳沒有錯(cuò)誤,其他的文件校驗(yàn)就不用去深究。
開發(fā)前端使用的是vue,后臺(tái)使用的是php,要利用python實(shí)現(xiàn)對(duì)這一接口的調(diào)用,那么就先要將前端數(shù)據(jù)給模擬出來,然后循環(huán)去調(diào)用接口,將文件分片上傳,我的思路大概如下:
1.獲取整個(gè)文件的大小、名字、后綴、分片總數(shù),定義每片文件的大?。?/p>
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) # 獲取文件的分片總數(shù) self.ext = os.path.basename(dat['path']).split('.').pop() # 獲取文件的后綴 self.name = os.path.basename(dat['path']) # 獲取文件的名字
2.獲取文件的md5,查看了開發(fā)那邊的md5算法,利用python實(shí)現(xiàn)過程如下:
# 使用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 # 開發(fā)那邊對(duì)md5的算法進(jìn)行了優(yōu)化,當(dāng)文件的大小小于1M時(shí),直接通過getmd5方法去獲取文件的md5值; # 當(dāng)文件大于1M時(shí),通過截取整個(gè)文件中的某幾個(gè)片段,然后拼接成一個(gè)文件,再去獲取其md5值,最后刪除這個(gè)文件 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.調(diào)用文件上傳的接口
def uploading(self, chunkIndex): MD5 = self.md5(self.path) # 整個(gè)文件的md5 start = (chunkIndex - 1) * self.CHUNK_SIZE # 截取文件的起始位置 end = min(self.size, start + self.CHUNK_SIZE)# 截取文件的結(jié)束位置 f = open(self.path, 'rb') f.seek(start) data = f.read(end) # 待分片上傳的數(shù)據(jù) f.close() path1 = 'D:/copy_' + str(os.path.basename(self.path)) # 將該數(shù)據(jù)保存在本地 f = open(path1, 'wb') f.write(data) f.close() chunk_md5 = self.md5(path1) # 讀取分片上傳數(shù)據(jù)的md5 # 將所有的數(shù)據(jù)儲(chǔ)存在files字典當(dāng)中,利用requests的files傳輸數(shù)據(jù) # 使用requests files類型時(shí),要像下面一樣構(gòu)建參數(shù),不然會(huì)有錯(cuò)誤 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發(fā)送接口請(qǐng)求 res = self.request.send('post', 'https://10.104.17.222/bank/elements/uploading', verify=False, files=files) os.remove(path1) # 刪除存在本地的分片文件 return res.json()
4.循環(huán)調(diào)用文件上傳的接口
chunkIndex = 1 while chunkIndex <= totalchunk: res2 = upload.uploading(chunkIndex) chunkIndex += 1
5.從服務(wù)器上去讀取通過接口上傳的文件的md5值,判斷是否正確
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python?Ajenti控制面板輕松地管理所有服務(wù)器網(wǎng)站
Ajenti是一個(gè)值得擁有的管理面板,免費(fèi)開源的管理面板工具,可以幫助你集中管理多個(gè)服務(wù)器和網(wǎng)站,Ajenti?支持?Linux、BSD、Mac?OS?X和Windows?等多個(gè)操作系統(tǒng),并且可以通過一個(gè)直觀的?Web?界面來完成各種系統(tǒng)管理任務(wù)2024-01-01Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解
開發(fā)應(yīng)用程序時(shí),若只有一個(gè)窗口則只需關(guān)心這個(gè)窗口里面的各控件之間如何傳遞數(shù)據(jù)。如果程序有多個(gè)窗口,就要關(guān)心不同的窗口之間是如何傳遞數(shù)據(jù)。本文介紹了PyQt5中三種窗口數(shù)據(jù)傳遞,需要的可以了解一下2022-12-12Python Socket編程實(shí)現(xiàn)猜數(shù)字游戲交互體驗(yàn)
當(dāng)利用Python的Socket編程創(chuàng)建一個(gè)猜數(shù)字游戲時(shí),需要分別實(shí)現(xiàn)服務(wù)器端和客戶端的邏輯,本文將詳細(xì)描述這兩個(gè)部分的功能和代碼片段2024-01-018種用Python實(shí)現(xiàn)線性回歸的方法對(duì)比詳解
這篇文章主要介紹了8種用Python實(shí)現(xiàn)線性回歸的方法對(duì)比詳解,說到如何用Python執(zhí)行線性回歸,大部分人會(huì)立刻想到用sklearn的linear_model,但事實(shí)是,Python至少有8種執(zhí)行線性回歸的方法,sklearn并不是最高效的,需要的朋友可以參考下2019-07-07Python編程之string相關(guān)操作實(shí)例詳解
這篇文章主要介紹了Python編程之string相關(guān)操作,結(jié)合實(shí)例形式分析了Python字符串相關(guān)函數(shù)與常見操作技巧,需要的朋友可以參考下2017-07-07python安裝virtualenv虛擬環(huán)境步驟圖文詳解
這篇文章主要介紹了python安裝virtualenv虛擬環(huán)境步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Python Matplotlib繪制動(dòng)畫的代碼詳解
使用matplotlib可以很容易地創(chuàng)建動(dòng)畫框架。在本文中我們就將利用Matplotlib制作幾個(gè)簡單的動(dòng)畫,文中的示例代碼講講詳細(xì),感興趣的可以了解下2022-05-05Django框架的使用教程路由請(qǐng)求響應(yīng)的方法
這篇文章主要介紹了Django框架的使用教程路由請(qǐng)求響應(yīng)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07