中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在python怎么實現一個自動化接口的文件分片上傳功能

發布時間:2020-11-20 15:14:38 來源:億速云 閱讀:242 作者:Leah 欄目:開發技術

在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()
    path2 = 'D:/copy_' + str(os.path.basename(self.path)) # 將該數據保存在本地
    f = open(path2, 'wb')
    f.write(data)
    f.close()
    chunk_md5 = self.md5(path2) # 讀取分片上傳數據的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(path2) # 刪除存在本地的分片文件
    return res.json()

4.循環調用文件上傳的接口

chunkIndex = 1
 while chunkIndex <= totalchunk:
 res2 = upload.uploading(chunkIndex)
 chunkIndex += 1

5.從服務器上去讀取通過接口上傳的文件的md5值,判斷是否正確

看完上述內容,你們掌握在python怎么實現一個自動化接口的文件分片上傳功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山东省| 潮安县| 岳池县| 临城县| 巴林右旗| 秦皇岛市| 太仆寺旗| 杭锦后旗| 东莞市| 泰兴市| 永登县| 华宁县| 满城县| 惠安县| 米易县| 武川县| 东乌珠穆沁旗| 砀山县| 兴文县| 综艺| 兴安盟| 铜鼓县| 武宁县| 句容市| 萝北县| 长宁区| 游戏| 小金县| 南澳县| 德兴市| 清徐县| 阳春市| 平顺县| 叙永县| 肇州县| 南部县| 瑞昌市| 巴中市| 靖州| 江都市| 会昌县|