这里主要是解决multipart/form-data这种格式的文件上传,基本现在http协议上传文件基本上都是通过这种格式上传

1 思路

一般情况下,如果我们往一个地址上传文件,则必须要登陆,登陆成功后,拿到cookies,然后在上传文件的请求携带这个cookies。

然后我们就需要通过浏览器在网站上传文件,这个时候我们需要打开浏览器的开发者工具或者fiddler,然后按照抓到包组装我们的上传文件的post请求

大家把握一个原则就是:在post请求中,用files参数来接受文件对象相关的参数,通过data/json参数接受post请求体的其他参数即可。

2 实现

2.1 登陆网站

使用requests.session()对象登陆网站,这里主要为了方便,下次直接用这个对象发送post上传文件的请求即可,不需要我们在请求体中添加cookies

  • 查找登录的URL

  • 查找请求头

  • 查找登录参数

代码如下:

import requestss = requests.session()res1 = s.post(url="http://127.0.0.1:5000/login",headers={'Host': '127.0.0.1:5000','Connection': 'keep-alive','Content-Length': '28','Cache-Control': 'max-age=0','sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"','sec-ch-ua-mobile': '?0','Upgrade-Insecure-Requests': '1','Origin': 'http://127.0.0.1:5000','Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Sec-Fetch-Site': 'same-origin','Sec-Fetch-Mode': 'navigate','Sec-Fetch-User': '?1','Sec-Fetch-Dest': 'document','Referer': 'http://127.0.0.1:5000/login','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9'},data={"account": "admin","password": "admin"}
)

2.2 手动上传文件,分析http请求的参数

由于谷歌浏览器无法查看上传文件时http请求的参数,故使用fiddler来进行抓包

抓包情况如下:

说明:

上图中第一个红框中参数后面全是乱码,这里就是我们上传的文件二进制格式的表现,这里的数据就是通过files参数接收

第二个红框中name的值就是k,比如cid就是k值,下一行的值 7 就是v,这里的参数就是要通过data参数接收

上面是http请求的raw格式,我们一般会看webForms格式的http请求

 分析完成后,可以看下代码:

res2 = s.post(url="http://127.0.0.1:5000/upload",headers={'Host': '127.0.0.1:5000','Connection': 'keep-alive','Content-Length': '28','Cache-Control': 'max-age=0','sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"','sec-ch-ua-mobile': '?0','Upgrade-Insecure-Requests': '1','Origin': 'http://127.0.0.1:5000',# 'Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Sec-Fetch-Site': 'same-origin','Sec-Fetch-Mode': 'navigate','Sec-Fetch-User': '?1','Sec-Fetch-Dest': 'document','Referer': 'http://127.0.0.1:5000/login','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9'},files={"filename_list": open("./test", "rb"),"Content-Type": "text/plain","Content-Disposition": "form-data","filename": "test"},data={"cid": "7"}
)

3 三个关键点

3.1 data参数

注意看k值和抓包中的对比

3.2 files参数

这里很关键,这里就是我们上传的文件对象了。filename_list 这个参数就代表文件文件对象,filename 这个值一般就是上传后的文件的名称(可以不写)

3.3 content-type参数

如果我们通过form-data的方式上传文件,我们组装post请求的时候,headers这个参数中一定不能要包括这个值,由requests库帮添加这个元素

如果我们自作聪明,会导致上传失败的,这里非常重要!!!

大家可以看到,我在代码中没有传递content-type这个参数,但是抓包是有这个参数的,所以这个参数我们一定不能加

实际抓包有这个参数

实际上传抓包验证即可,和浏览器上传略有不同,但是不影响上传

python通过http上传文件相关推荐

  1. Python使用FTP上传文件

    Python使用FTP上传文件 本文主要介绍如何使用Python通过FTP上传文件. FTP简介 FTP即文件传输协议(File Transfer Protocol),是用于在网络上进行文件传输的一种 ...

  2. python模拟浏览器上传文件_Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)...

    http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的. multipart/form-data的基础方法是post,也就是说是由post方法来组合实 ...

  3. python 抓包 上传 文件_Python接口测试文件上传实例解析

    接口测试中,上传文件的测试场景非常常见.例如:上传头像(图片).上传文件.上传视频等.下面以一个上传图片的例子为大家讲解如何通过 python 测试上传文件接口. 首先通过抓包分析上传文件接口的请求参 ...

  4. python调用接口上传文件_python接口自动化7-post文件上传

    前言 文件上传在我们软件是不可少的,最多的使用是体现在我们后台,当然我们前台也会有.但是了解过怎样上传文件吗?这篇我们以禅道文档-创建文档,上传文件为例. post请求中的:Content-Type: ...

  5. python 中文姓名库,Python Requests库上传文件中文文件名处理方法是什么

    使用Python Requests库,提交POST请求上传文件,不支持中文文件名? 使用Python Requests库,向微信服务器上传媒体问题. 当使用英文文件名称,上传时,一切OK. 当下面代码 ...

  6. Python Request POST 上传文件 Multipart/form-data

    项目场景: 我的第一个博客:使用python request模块向服务器接口上传图片 问题描述 某app上传图片接口的包 原因分析: 问题的关键词:请求头 Content-Type:multipart ...

  7. python 上传文件夹,python – 使用Flask上传文件夹/文件

    我可以通过这个例子上传一个带烧瓶的文件: 但我不知道如何上传文件夹或一些文件.我搜索过,我发现了这个: Uploading multiple files with Flask.最后,我得到了如何上传多 ...

  8. 西游之路——python全栈——上传文件

    1 from django.shortcuts import render,HttpResponse 2 3 def upload(request): 4 if request.method == ' ...

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

    HTML: <div ><input type="file" name="FileUpload" id="FileUpload&qu ...

  10. python操作谷歌浏览器上传文件封装

    在谷歌浏览器打开某个页面(举个例子,chrom浏览器版的百度网盘上传文件),点击上传文件时,会出现上面的弹框,因为这个弹框是属于"操作系统的行为",selenium是不能定位到的, ...

最新文章

  1. IOS开发中多线程的使用
  2. ASP.NET MVC编程——视图
  3. python写appium_案例分享,Python +appium做登录功能
  4. 将字符转换成数字(atoi),将数字转换成字符(itoa)
  5. python生成数字_Python生成数字图片代码分享
  6. 物联网终端五年后将超 270 亿!破竹之势下程序员如何修炼内功?
  7. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式...
  8. 内存测试软件 ddr 4,DDR4内存理论性能测试
  9. 回调函数Callback
  10. 什么是51单片机最小系统?
  11. 路由控制配置 peer as- number命令解析
  12. 鸢尾花lris数据集的SVM线性分类
  13. aligned内存对齐
  14. Springboot毕设项目共享单车管理系统93je9(java+VUE+Mybatis+Maven+Mysql)
  15. unity使用tiled文件,将数据用unity打开,可以无限tiled地图
  16. CAD版本转换知识大全
  17. 泛微OA的Linux系统之App服务器设置
  18. Java:apache.poi读写Excel文件
  19. 静态时序分析(STA)
  20. 用JAVA写一个古诗生成器_简简单单用java写一个营销号话术生成器

热门文章

  1. 【数学建模】关联与因果问题
  2. ies文件 vray_VRayIES灯光
  3. 单元货格式自动化立体仓库AR/RS货架 高效的货位管理及空间利用率的使用
  4. SQL SERVER 2019安装 SQL Prompt 10.02版本
  5. Hash(MD5校验工具)
  6. 广东计算机科学导论考试试卷,计算机科学导论试题A答案
  7. 服务器备份文件bak怎么打开,bak文件怎么打开?打开bak文件的方法
  8. 庖丁解牛之-Android平台RTSP|RTMP播放器设计
  9. kotlin的属性代理
  10. hadoop学习使用