python requests 上传文件_python-requests模拟上传文件-带参数

方法1:

1.安装requests_toolbelt依赖库

#代码实现

defupload(self):

login_token=self.token.loadTokenList()for token inlogin_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对象需要的参数:将tempPassword_data的字段合并至files

1.files参数介绍:

1.字典key对应file字段(我们系统是这样,具体结合前端实际的字段为准),如图

1357367-20200412110237645-1576972733.png

2.字典value里面的对象:

1.filename(服务器最终存储的文件名)

2.filepath(具体的文件路径,注意转义),文件是以二进制的形式进行传输的,所以这里传输时以二进制的形式打开文件并传输

3.content_type:具体结合前端实际的字段为准:一般可定义为: 文本(text)/图片(image)等

3.tempPassword_data:为文件上传时的附带参数strToDict方法:自己手写的一个字符串转dict的方法

遇到的问题:

1357367-20200412111332797-1644452835.png

这个错误是说,int对象不能被编码,所以需要手动将int对象转换为str,所以我在此方法中定义了value_type这个参数,用于将字典中的所有value转换为str类型

#具体代码实现,仅供参考

def strToDict(str_in,value_type=None):#value_type:转换字典的value为指定的类型,未防止异常,目前仅支持str

#'''将str转换为dict输出'''

#'''将带有time关键字的参数放到字符串末尾'''

#print(str_in)

ifstr_in:

match_str= ':'split_str= '\n'split_list=str_in.split(split_str)

str_in_dict={}for i insplit_list:

colon_str_index=i.find(match_str)if colon_str_index == -1:#'''处理firefox复制出来的参数'''

match_str = '\t' or ' 'colon_str_index=i.find(match_str)#'''去掉key、value的空格,key中的引号'''

str_in_key =i[:colon_str_index].strip()

str_in_key= str_in_key.replace('"','')

str_in_key= str_in_key.replace("'",'')#正则过滤无用key,只保留key第一位为字母数据获取[]_

str_sign = re.search('[^a-zA-Z0-9\_\[\]+]', str_in_key[0])if str_sign isNone:#处理value中的空格与转义符

str_in_value = i[colon_str_index + 1:].strip()

str_in_value=str_in_value.replace('\\','')try:#遇到是object类型的数据转换一下

str_in_value=eval(str_in_value)exceptBaseException as error:

str_in_value=str_in_valueif 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_valuereturnstr_in_dictelse:print("参数都没有,还处理个球嘛")return None

3.请求时将headers的content设置为m.content_type,会设置headers的content_type为form—data,类型为str:

MultipartEncoder相关源码:

1357367-20200412113134292-1997870940.png

1357367-20200412112912748-2142453909.png

4.请求时设置data为m,会输出一个MultipartEncoder对象:

1357367-20200412113358584-937037532.png

方法2:

直接使用requests,无需依赖requests_toolbelt库

过程大同小异,也是需要将字典的value转换为str

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

请求时:data对应附加参数,files对应files对象

#相关代码

defupload(self):

login_token=self.token.loadTokenList()for token inlogin_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())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值