遇到了一個問題,使用requests進行轉發 requests響應流的時候,出現各種問題,問題的描述沒有記錄,不過Debug以下終於解決了問題。。。。。。。下面簡單的描述解決方案
response = _RequestUtil.post_request_server("upload", data={ "blockByteSize": imageBuffer.nbytes, "currentBlockIndex": 0, "id": data["id"] }, files={ "multipartFile": imageBuffer })
表單中的請求參數放到data中,文件數據放到files字典中
requests的屬性files會通過判斷幾個類型進而決定是否攜帶數據流
for field, val in fields: # 這個for語句決定data字典中的屬性 if isinstance(val, basestring) or not hasattr(val, '__iter__'): val = [val] for v in val: if v is not None: # Don't call str() on bytestrings: in Py3 it all goes wrong. if not isinstance(v, bytes): v = str(v) new_fields.append( (field.decode('utf-8') if isinstance(field, bytes) else field, v.encode('utf-8') if isinstance(v, str) else v)) for (k, v) in files: # 這個files決定了你傳的files屬性的值,進行遍歷 # support for explicit filename ft = None fh = None if isinstance(v, (tuple, list)): # 判斷你傳的元組的個數,選擇不同的行爲 if len(v) == 2: fn, fp = v elif len(v) == 3: fn, fp, ft = v else: fn, fp, ft, fh = v else: fn = guess_filename(v) or k fp = v if isinstance(fp, (str, bytes, bytearray)): # 這裏是文件對象的關鍵之處,當files的鍵對應的值是以下時,會攜帶上的 fdata = fp elif hasattr(fp, 'read'): # 這裏也就是判斷以下對應的值對象是否包含read方法 fdata = fp.read() elif fp is None: continue else: fdata = fp
rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) # 最終文件對象會打包成 RequestField 對象
rf.make_multipart(content_type=ft)
# new_fields 這個是最終保存所有字段的列表對象
new_fields.append(rf)