网络编程
位置:首页>> 网络编程>> Python编程>> python通过http上传文件思路详解

python通过http上传文件思路详解

作者:梦因you而美  发布时间:2022-02-08 12:48:30 

标签:python,上传文件

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

1 思路

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

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

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

2 实现

2.1 登陆网站

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

查找登录的URL

python通过http上传文件思路详解

查找请求头

python通过http上传文件思路详解

查找登录参数

python通过http上传文件思路详解

代码如下: 


import requests

s = 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来进行抓包

python通过http上传文件思路详解

抓包情况如下:

python通过http上传文件思路详解

说明:

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

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

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

python通过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值和抓包中的对比

python通过http上传文件思路详解

python通过http上传文件思路详解

3.2 files参数

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

python通过http上传文件思路详解

python通过http上传文件思路详解

3.3 content-type参数

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

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

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

python通过http上传文件思路详解

 实际抓包有这个参数

python通过http上传文件思路详解

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

来源:https://blog.csdn.net/apollo_miracle/article/details/118436722

0
投稿

猜你喜欢

  • python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就
  • alt的准确含义是,当照片不存在或者load错误时的提示。但同时img也同时支持alt和title,再有某些浏览器的错误解析,因此经常被误导
  • assert断言声明,遇到错误则立即返回在使用python语言开发深度学习模型时,经常会遇到模型运行结束时才会发现的崩溃状态,或者得到的结果
  • 任务详情给定一各地 2016 年 1 月和 2 月各个时间点的温度表格,表格预览见页面下方。数据表的第二列表示当前时间,数据表第一行第三列到
  •  代码如下:SELECT * FROM Orders WHERE OrderGUID IN('BC71D821-9E25-
  • 使用Python爬虫登录系统之后,能够实现的操作就多了很多,下面大致介绍下如何使用Python模拟登录。我们都知道,在前端的加密验证,只要把
  • 前言虽然现在文件上传下载工具多如牛毛,比如http、ftp、sftp、scp等方案都可以用于文件传输,但都是需要安装服务器甚至客户端。有一种
  • 本文只讨论Oracle中最常见的索引,即是B-tree索引。本文中涉及的数据库版本是Oracle8i。 一. 查看系统表中的用户索引 在Or
  • 在我们写样式的时候,页面的CSS在经历几个版本的修改之后,可能有些样式已经用不到了,或许将某些样式更名了而原来的忘了删除,总之页面中可能存在
  • 相信没有人不知道 Firebug 是什么东西,但有时候我们糟糕的代码不想让同行轻松的使用 F12 就能一览无遗。那么怎么办呢?这里有个猥琐的
  • 大家觉得在接手遗留代码时,见到什么东东是最让人感到不耐烦的?复杂无比的 UML ?我觉得不是。我的答案是,超过两个 else 的 if ,或
  • 添加字段的语法:alter table tablename add (column datatype [default value][nul
  • SQL Server与Oracle、DB2的优劣对比:1.开放性:SQL Server只能在Windows上运行,没有丝毫的开放性,操作系统
  • Data Points Archive 有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。啊,但关键在于确定如
  • 想查找mac下python的site-packages目录,如果用网上搜的安装目录之类的去找,进去每一层很多都是软链接形式存在,比较浪费时间
  • 1. 你必须有自己的服务器,可以在服务器上建立站点。2. 域名管理里  你的域名必须支持泛解析。(现在好像除了 双线双I
  • 由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对C
  • 完全备份的SH文件:exp_comp.shrq=` date +"%m%d" `su - oracle -c "
  • 通过本篇内容给大家介绍一下Python实现金融数据可视化中两列数据的提取、分别画、双坐标轴、双图、两种不同的图等代码写法和思路总结。impo
  • 如何把程序打包为whl首先需要一个库:setuptools如果是conda环境的话,这个包是自带的,不需要另外安装。首先把需要打包的py文件
手机版 网络编程 asp之家 www.aspxhome.com