方法1:

  1.安装requests_toolbelt依赖库

    

#代码实现
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对象需要的参数:将tempPassword_data的字段合并至files
  1.files参数介绍: 
    1.字典key对应file字段(我们系统是这样,具体结合前端实际的字段为准),如图

2.字典value里面的对象:
  1.filename(服务器最终存储的文件名)
  2.filepath(具体的文件路径,注意转义),文件是以二进制的形式进行传输的,所以这里传输时以二进制的形式打开文件并传输
  3.content_type:具体结合前端实际的字段为准:一般可定义为: 文本(text)/图片(image)等
3.tempPassword_data:为文件上传时的附带参数
  strToDict方法:自己手写的一个字符串转dict的方法
  遇到的问题:

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

    
#具体代码实现,仅供参考
def strToDict(str_in,value_type=None):
# value_type:转换字典的value为指定的类型,未防止异常,目前仅支持str
# '''将str转换为dict输出'''
# '''将带有time关键字的参数放到字符串末尾'''
# 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复制出来的参数'''
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 is None:
# 处理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)
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("参数都没有,还处理个球嘛")
return None
  3.请求时将headers的content设置为m.content_type,会设置headers的content_type为form—data,类型为str:
MultipartEncoder相关源码:

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

方法2:

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

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

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

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

  

 
#相关代码
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())

  



 

python-requests模拟上传文件-带参数的更多相关文章

  1. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

    ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...

  2. vue + axios + formdata 上传文件带参数的爬坑之路

    submitForm(event) { let formData = new FormData() formData.append('name', this.name) formData.append ...

  3. Python基于Python实现批量上传文件或目录到不同的Linux服务器

    基于Python实现批量上传文件或目录到不同的Linux服务器   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...

  4. postman上传文件对参数的contentType类型设置方式

    项目中使用postman模拟上传文件接口时,总是不成功,发现content-type设置不对,设置head的contentType后,还是不行,后来无意中发现文件参数默认的content-type类型 ...

  5. jquery ajax php 无刷新上传文件 带 遮罩 进度条 效果的哟

    在很多项目中都会叫用户上传东西这些的,自从接触了jquery 和ajax之后就不管做什么,首先都会想到这个,我这个人呢?是比较重视客户体验的,这次我这边负责的是后台板块,然后就有一块是要求用户上传照片 ...

  6. Django之用户上传文件的参数配置

    Django之用户上传文件的参数配置 models.py文件 class Xxoo(models.Model): title = models.CharField(max_length=128) # ...

  7. 【转】php通过curl跨域向asp.net服务器上传文件及参数

    转:http://blog.sina.com.cn/s/blog_13331dce50102vq32.html 这是一个由php通过调用asp.net接口向asp.net服务器post上传文件及参数并 ...

  8. SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

    一.配置SpringMVC 二.单文件与多文件上传 三.多文件上传 四.带参数上传 一.配置SpringMVC 在spring.xml中配置: <!-- springmvc文件上传需要配置的节点 ...

  9. SWFUpload多图上传、C#后端跨域传文件带参数

    前几天工作中用到了SWFUpload上传图片,涉及到跨域,因为前端无法实现跨域,所以只能把文件传到后端进行跨域请求,整理分享下. 效果图 前端 html部分 <!DOCTYPE html> ...

  10. Requests库上传文件时UnicodeDecodeError: 'ascii' codec can't decode byte错误解析

    在使用Request上传文件的时候碰到如下错误提示: 2013-12-20 20:51:09,235 __main__ ERROR 'ascii' codec can't decode byte 0x ...

随机推荐

  1. GDB原始函数信息中获取函数名

    示例: kwdbts::Logger::log(kwdbts::_kwdbContext_t*, kwdbts::KwdbModule, kwdbts::LogSeverity, char const ...

  2. C# 导出datatable数据到excel

    第一步:下载两个需要的NUGET包 1.org.in2bits.MyXls:2.NPOI 第二步:关键类OutExcel. using System; using System.Linq; using ...

  3. Pipenv 使用

    Pipenv 是 Python 官方推荐的依赖管理工具,旨在简化 pip 和 virtualenv 的使用.其使用 Pipfile 和 Pipfile.lock 来管理项目的依赖和虚拟环境. 安装 p ...

  4. Go 接收命令行参数

    在 Go 语言中,可以使用标准库中的 os 包和 flag 包来接收和处理命令行参数. 使用 os 包 os.Args 是一个字符串切片,其中第一个元素是程序的名称,后续元素是传递给程序的命令行参数. ...

  5. Mathematica的介绍及使用方法

    Mathematica 是由 Wolfram Research 公司开发的数学软件,可用于数学.物理.工程.生物等领域的计算和建模.其官方网站为 www.wolfram.com/mathematica ...

  6. .NET 8.0 前后分离快速开发框架

    前言 大家好,推荐一个.NET 8.0 为核心,结合前端 Vue 框架,实现了前后端完全分离的设计理念.它不仅提供了强大的基础功能支持,如权限管理.代码生成器等,还通过采用主流技术和最佳实践,显著降低 ...

  7. ECMA Script6 中的 尾调用优化

    在读 <深入理解ES6>一书中,看到有关函数的 "尾调用优化" 章节,特此记录一下 尾调用 指的是 函数作为另一个函数的最后一条语句被调用: function foo ...

  8. echarts的x轴显示不全的解决办法

    echarts的x轴显示不全的解决办法 一.背景 当x轴类目较多时,label显示时会自动间隔显示,也就是会隐藏掉中间的label,如下图: 二.解决办法 通过设置 xAxis.axisLabel.i ...

  9. 安全 – CSP (Content Security Policy)

    前言 之前讲过 CSRF.防 Cookie hacking 的. 也介绍过防 XSS 的 HtmlSanitizer. 今天再介绍 CSP. 参考 Content Security Policy 介绍 ...

  10. Nuxt Kit 中的页面和路由管理

    title: Nuxt Kit 中的页面和路由管理 date: 2024/9/17 updated: 2024/9/17 author: cmdragon excerpt: 摘要:本文介绍了Nuxt ...