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

方法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())

  


 

原文地址:https://www.cnblogs.com/qtclm/p/12684360.html

时间: 2024-11-11 22:32:38

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

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

ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '&qu

七牛跨服务器上传文件带参数

HttpPostedFileBase file = Request.Files["file"]; //System.IO.Stream s = file.InputStream; byte[] buffer = new byte[1024]; //int bytesRead = 0; //while ((bytesRead = file.InputStream.Read(buffer, 0, buffer.Length)) != 0) //{ //} buffer=StreamToBy

httpclient 4.3 psot方法上传文件与参数 中文乱码解决

废话不多说,直接上有码的! 1 package httpclient; 2 3 import java.io.File; 4 import java.nio.charset.Charset; 5 6 import org.apache.http.Consts; 7 import org.apache.http.Header; 8 import org.apache.http.HttpEntity; 9 import org.apache.http.client.methods.Closeable

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

一.配置SpringMVC 在spring.xml中配置: <!-- springmvc文件上传需要配置的节点--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="-1&

python各种post上传文件

1.带证书上传文件 filename = '/tmp/test.cert'hash_v = 'assumethisisahash' #这是一种流式上传的方式with open(filename, 'rb') as f:....requests.post(link, data={'hash': hash_v}, files={'filename':f}, verify='/tmp/test.cert') 2.最简单的流式上传 with open('massive-body') as f: requ

Extjs 使用fileupload插件上传文件 带进度条显示

一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提交的同时执行实际的文件上传. 因为没有安全的跨浏览器以编程的方式对file表单项设值的方式, 所以标准表单项的 setValue 方法是无效的. getvalue方法的返回值取决于使用何种浏览器; 一些仅仅返回文件名, 一些返回一个完整的文件路径, 一些则返回文件的虚拟路径. 二.在我看来这个插件就

Ajax+Python flask实现上传文件功能

HTML: <div > <input type="file" name="FileUpload" id="FileUpload"> <a class="layui-btn layui-btn-mini" id="btn_uploadimg">上传图片</a> </div> Ajax实现: <script type="text/js

EXTJS+ASP.NET上传文件带实时进度条代码

一,文件夹 二,upLoad.cs是继承IHttpModule的类: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Reflection; using System.Globalization; using System.Web.Hosting; /// <summary>

vc libcurl 模拟上传文件

http://www.cnblogs.com/killbit/p/5393301.html 附上这篇文章,因为当时就已经想到了模拟上传,但是因为时间关系,所以就直接用PHP写了.现在改进一下,用VC+libcurl库.   我们也直接可以用MYSQL写入这段上传代码就可以了. select 0x3C3F70687020696628245F46494C45535B2766696C65275D5B276E616D65275D20213D20222229207B20636F70792028245F46