通常提交普通表单时,requests的post方法可以指定headers,所以我在使用requests模拟上传文件行为时,直接按照下面的方式写了:

然后服务器就报出了找不到分隔符Invalid multipart/form-data: multipart boundary not found

网上找了半天也没找到为什么,倒是大家给的示例比我写的少用了一个headers,尝试着调整了一下,去掉headers参数就可以上传了,我怀疑时requests内部会检查用户是否已经定义了headers,如果定义了,则直接使用,否则requests根据其他参数自动给生成headers。

所以我想,如果是这样,那我再headers里把需要的内容都写上,应该也是可以的,上面提示未找到boundary,那么我自己写上boundary(http协议允许用户自定义boundary):

定义了boundary,但是服务器却报出没有final boundary,我们知道,post编码时,发送前会用boundary分割不同字段,最后以前后都有--的boundary结束。所以,出现找不到final boundary应该就是自定义的boundary没有起到作用,去看源代码吧。

翻出requests源代码,在models.py文件里,函数就是对post字段进行编码的,对于上传文件来讲,content_type来自函数;最终通过生成boundary,拼接出模块内的content_type。

如果用户没有自定义content-type,那么就使用模块内自己随机生成的boundary。但是返回到prepare_body里,最后会判断用户是否定义了Content-type,如果定义了则使用用户定义好的,相关代码如下:

所以,从这里可以看出,无论用户怎么定义Content-type,实际用到的boundary还是模块自己生成的,而且一旦用户自定义了content-type,最终post请求的headers里携带的boundary跟实际编码用到的boundary就会不一致,导致服务器端无法解析。

总结为一句话:使用requests的post方法上传文件时,不能自定义headers里的content-type。

python requests 上传文件_python3使用requests上传文件,content-type踩的坑的更多相关文章

  1. drupal7 开发自定义上传、下载模块的上传功能

    关键点有两个:1.在页面上显示出上传的控件,2.代码实现文件上传到服务器的功能 一.显示控件: 先来看关键点1: 实现页面显示出上传控件, 关键代码: $form['my_file_field'] = ...

  2. 用python做的windows和linx文件夹同步。解决自动同步、加快传输大量小文件的速度、更丰富的文件上传过滤设置。

    现在工具不好用,用的pycharm自动同步,但对于git拉下来的新文件不能自动上传到linux,只有自己编辑过或者手动ctrl + s的文件才会自动同步.导致为了不遗漏文件,经常需要全量上传,速度非常 ...

  3. 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

    json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] ...

  4. Python爬虫系列(三):requests高级耍法

    昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...

  5. python之爬虫(四)之 Requests库的基本使用

    什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...

  6. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  7. jmert中如何测试上传文件接口(测试上传excel文件)

    第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...

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

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

  9. 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件

    1. 多个PDF文件合并1.1 需求描述有时候,我们下载了多个PDF文件, 但希望能把它们合并成一个PDF文件.例如:你下载的数个PDF文件资料或者电子发票,你可以使用python程序合并成一个PDF ...

  10. Github使用.gitignore文件忽略不必要上传的文件 (转)

    原文地址: https://blog.csdn.net/gjy211/article/details/51607347 常用编程语言及各种框架平台下的通用   .gitignore   文件 http ...

随机推荐

  1. Vue基础 · 组件的使用(4)

    组件 将公用的功能抽离出来,形成组件:目的:复用代码. 1.1 全局组件 <div id="app"> <!--引用组件,可多次引用--> <demo ...

  2. mobx hook中的使用

    class import { inject, observer } from "mobx-react"; // 需要使用mobx-react提供的Provider 包裹,需要使用的 ...

  3. memoの颜色配置

    Visual Studio的配置 没啥说的,直接上网站: https://studiostyl.es/schemes/create 顺便保存一份我的配置 一些有趣的插件:Amigo 主题配色,还是Bl ...

  4. memoのls

    memoのls 测试环境是Big Sur 11.2.2 在windows下都不知道cd /D E:\xxx\xxx可以直接切换盘符.今天才发现,ls命令我也不会用-- ls命令是真强大啊,之前只知道l ...

  5. STM32 获取系统时钟频率

    //定义一个RCC_ClocksTypeDef 的结构体 RCC_ClocksTypeDef get_rcc_clock; //调用RCC_GetClocksFreq获取系统时钟状态 RCC_GetC ...

  6. Kubernetes--Ingress资源

    Ingress资源 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是"TC ...

  7. SpringMVC-nfjh

    SpringMVC springmvc项目创建 1.使用maven创建web项目结构 2.补充更改结构 3.springmvc-config.xml 1)添加包扫描(context命名空间) 2)添加 ...

  8. 定长线程池Demo

    1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 4 /** 5 * ...

  9. 使用php为本地html文件生成url

    1. 查看你是不是有php which php 2.  假设你的Demo.html 路径为 /Users/Sheron/Downloads/Demo.html cd /Users/Sheron/Dow ...

  10. Python基础数据类型-Number(数字)

    a = -1 # int b = 2.0 # float c = 13.11 # float d = 3.14j # complex print(type(a), type(b), type(c), ...