通常提交普通表单时,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. LaTex【六】表格排版—表格标题位置

    LaTex中表格排版--表格描述位置调整 LaTex模板大多默认将表格描述置于表格下方,可通过修改 \caption 的位置调整. 1. 位于表格下方(默认) \begin{table}[h] \be ...

  2. Python中用requests处理cookies的3种方法

    在接口测试中,大多数项目的接口是需要登录后进行操作的,经常用到requests库进行模拟登录及登录后的操作,下面是我不断踩坑后总结出来的关于登录凭证cookies的3种操作方法. 一. 用 reque ...

  3. vue dialog弹窗

    <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title=&quo ...

  4. Linux系统备份与还原——dump备份命令

    dump是Linux下非常好用的备份工具,系统默认没有安装该工具,可以通过yum来安装使用 [root@localhost ~]# rpm -qa |grep dump [root@localhost ...

  5. 如何判断JS数据类型

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined.N ...

  6. M1 安装homebrew详解

    1.打开终端创建安装目录 sudo mkdir -p /opt/homebrew 2.修改目录权限 sudo chown -R $(whoami) /opt/homebrew 3.进入opt文件夹 c ...

  7. TypeScript - 安装,类型

    // 要使用typescript需要全局安装 通过tsc -v 来验证是否安装成功 npm i -g typescript// ts 文件中完全可以写js语法, 完全兼容js // ts 本身在运行时 ...

  8. element ui修改文本框高度以及图标不居中的问题

    .el-input__inner{ height:30px !important; .el-input__icon{ line-height: 24px !important; } .el-range ...

  9. 【Docker】清理磁盘占用

    查看磁盘空间占用 # /var/lib/docker # du -sh * 快速清理 简单清除不使用的镜像及容器 docker system prune docker system prune -a ...

  10. 【Java】生成随机字符串

    package com.runsky.utils; import java.util.Random; public class GetRandom { private static final Str ...