溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

發(fā)布時(shí)間:2020-08-01 11:54:49 來(lái)源:億速云 閱讀:370 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要講解了Python基于requests實(shí)現(xiàn)模擬上傳文件的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

方法1:

1.安裝requests_toolbelt依賴庫(kù)

#代碼實(shí)現(xiàn)
def upload(self):
    login_token = self.token.loadTokenList()
    for token in login_token:
      tempPassword_url = self.config['crm_test_api']+'/document/upload'
      tempPassword_data = self.data_to_str.strToDict('''title:1.png
      course_name_id:63
      course_id:1112
      desc:7
      doc_type:1
      is_public:1''',value_type='str')
      files={'file': ('1.png', open('C:\\Users\\Acer\\Pictures\\Screenshots\\1.png', 'rb'), 'image/png')}
      tempPassword_data.update(files)
      m = MultipartEncoder(
        fields=tempPassword_data
      )
      tempPassword_headers = {"Content-Type": m.content_type, "token": token}
      tempPassword_request = requests.post(url=tempPassword_url,data=m,headers=tempPassword_headers)
      print(tempPassword_request.content)

2.組裝MultipartEncoder對(duì)象需要的參數(shù):將tempPassword_data的字段合并至files

1.files參數(shù)介紹:

1.字典key對(duì)應(yīng)file字段(我們系統(tǒng)是這樣,具體結(jié)合前端實(shí)際的字段為準(zhǔn)),如圖

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

2.字典value里面的對(duì)象:

  1.filename(服務(wù)器最終存儲(chǔ)的文件名)

  2.filepath(具體的文件路徑,注意轉(zhuǎn)義),文件是以二進(jìn)制的形式進(jìn)行傳輸?shù)?,所以這里傳輸時(shí)以二進(jìn)制的形式打開文件并傳輸

  3.content_type:具體結(jié)合前端實(shí)際的字段為準(zhǔn):一般可定義為: 文本(text)/圖片(image)等[/code][code]

3.tempPassword_data:為文件上傳時(shí)的附帶參數(shù)

  strToDict方法:自己手寫的一個(gè)字符串轉(zhuǎn)dict的方法

  遇到的問(wèn)題:

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

這個(gè)錯(cuò)誤是說(shuō),int對(duì)象不能被編碼,所以需要手動(dòng)將int對(duì)象轉(zhuǎn)換為str,所以我在此方法中定義了value_type這個(gè)參數(shù),用于將字典中的所有value轉(zhuǎn)換為str類型

#具體代碼實(shí)現(xiàn),僅供參考
def strToDict(str_in,value_type=None):
    # value_type:轉(zhuǎn)換字典的value為指定的類型,未防止異常,目前僅支持str
    # '''將str轉(zhuǎn)換為dict輸出'''
    # '''將帶有time關(guān)鍵字的參數(shù)放到字符串末尾'''
    # print(str_in)
    if str_in:
      match_str = ':'
      split_str = '\n'
      split_list = str_in.split(split_str)
      str_in_dict = {}
      for i in split_list:
        colon_str_index = i.find(match_str)
        if colon_str_index == -1:
          # '''處理firefox復(fù)制出來(lái)的參數(shù)'''
          match_str = '\t' or ' '
          colon_str_index = i.find(match_str)
        # '''去掉key、value的空格,key中的引號(hào)'''
        str_in_key = i[:colon_str_index].strip()
        str_in_key = str_in_key.replace('"','')
        str_in_key = str_in_key.replace("'",'')
        # 正則過(guò)濾無(wú)用key,只保留key第一位為字母數(shù)據(jù)獲取[]_
        str_sign = re.search('[^a-zA-Z0-9\_\[\]+]', str_in_key[0])
        if str_sign is None:
          # 處理value中的空格與轉(zhuǎn)義符
          str_in_value = i[colon_str_index + 1:].strip()
          str_in_value=str_in_value.replace('\\','')
          try:
            # 遇到是object類型的數(shù)據(jù)轉(zhuǎn)換一下
            str_in_value=eval(str_in_value)
          except BaseException as error:
            str_in_value=str_in_value
          if value_type in ['str','string']:
            str_in_value=str(str_in_value)
          else:
            str_in_value=str_in_value
          str_in_dict[str_in_key] = str_in_value
      return str_in_dict
    else:
      print("參數(shù)都沒(méi)有,還處理個(gè)球嘛")
      return None

3.請(qǐng)求時(shí)將headers的content設(shè)置為m.content_type,會(huì)設(shè)置headers的content_type為form—data,類型為str:

MultipartEncoder相關(guān)源碼:

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

    4.請(qǐng)求時(shí)設(shè)置data為m,會(huì)輸出一個(gè)MultipartEncoder對(duì)象:

Python基于requests實(shí)現(xiàn)模擬上傳文件的方法

方法2:

  直接使用requests,無(wú)需依賴requests_toolbelt庫(kù)

  過(guò)程大同小異,也是需要將字典的value轉(zhuǎn)換為str

  注意:headers不要傳content_type字段,headers不要傳content_type字段,headers不要傳content_type字段

  請(qǐng)求時(shí):data對(duì)應(yīng)附加參數(shù),files對(duì)應(yīng)files對(duì)象

#相關(guān)代碼
def upload(self):
    login_token = self.token.loadTokenList()
    for token in login_token:
      tempPassword_url = self.config['crm_test_api']+'/document/upload'
      tempPassword_data = self.data_to_str.strToDict('''title:1.png
      course_name_id:63
      course_id:1112
      desc:7
      doc_type:1
      is_public:1''',value_type='str')
      files={'file': ('1.png', open('C:\\Users\\Acer\\Pictures\\Screenshots\\1.png', 'rb'), 'image/png')}
      tempPassword_headers = {"token": token}
      tempPassword_request = requests.post(url=tempPassword_url,data=tempPassword_data,files=files,headers=tempPassword_headers)
      print(tempPassword_request.json())

看完上述內(nèi)容,是不是對(duì)Python基于requests實(shí)現(xiàn)模擬上傳文件的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI