以前写过一篇博客,说的如何python如何经过http下载文件,今天写一篇博客来介绍以下,python如何经过request库实现上传文件php
这里主要是解决multipart/form-data这种格式的文件上传,基本如今http协议上传文件基本上都是经过这种格式上传html
通常状况下,若是咱们往一个地址上传文件,则必需要登录,登录成功后,拿到cookies,而后在上传文件的请求携带这个cookies。python
而后咱们就须要经过浏览器在网站上传文件,记得,这个时候抓包要使用fiddler工具,会更加保险,而后按照fiddler抓到包组装咱们的上传文件的post请求web
你们把握一个原则就是:在post请求中,用files参数来接受文件对象相关的参数,经过data/json参数接受post请求体的其余参数便可。json
一、使用requests.session()对象登录网站,这里主要为了方便,下次直接用这个对象发送post上传文件的请求便可,不须要咱们在请求体中添加cookies浏览器
import requests s = requests.session() res1 = s.post( url="http://10.222.222.7/src/welcome.php", headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded", "Host": "10.222.222.7", "Origin": "http://10.222.222.7", "Referer": "http://10.222.222.7/src/welcome.php", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36" }, data = { "name": "admin", "password": "admin", "button": "登陆", "opr": "login", }, # 这里配置了代理,由于个人操做安装了fiddler,这个大家没有说必定要弄 proxies={ "http": "http://127.0.0.1:8888", "https": "http://127.0.0.1:8888" } )
二、手动上传,经过fiddler抓包,分析http请求的参数cookie
上面是http请求的raw格式,咱们通常会看webForms格式的http请求session
三、分析完成后,咱们能够看下代码app
import json file = { "sample_file": open("D:\\abdi\\37571.pcap", "rb"), "Content-Type": "application/octet-stream", "Content-Disposition": "form-data", "filename" : "3757.pcap" } # # res = s.post( url="http://10.222.222.7/src/system_sample.php/system_sample/add", headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "max-age=0", "Connection": "keep-alive", # "Content-Type": "multipart/form-data", "Host": "10.222.222.7", "Origin": "http://10.222.222.7", "Referer": "http://10.222.222.7/src/html.php/html/system_samples", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36" }, files = file, data = { "sample_name" : "37571.pcap", "owner_group" : "/data/atp/pcap/custom/test", "type" : "1", "sample_file_path" : "", "description_file_path" : "", # "description_file":"" }, proxies = { "http":"http://127.0.0.1:8888", "https":"http://127.0.0.1:8888" } )
这里有三个关键的地方工具
a、data参数,注意看k值和抓包中的对比
不一样的网站的name的值可能不同,可是大部分你们都会用file,可是有时候开发人员也不会按照常规套路来作,因此咱们不能想固然就认为是files。要经过抓包分析
这个值通常就是上传后的文件的名称;其余几个参数的意义就不重要了,你要根据具体的状况分析组装上传就能够了
b、files参数,这里很关键,这里就是咱们上传的文件对象了
sample_file这个参数就表明文件文件对象
c、content-type参数,若是咱们经过form-data的方式上传文件,咱们组装post请求的时候,headers这个参数中必定不能要包括这个值,由requests库帮添加这个元素
若是咱们自做聪明,会致使上传失败的,这里很是重要!!!
你们能够看到,我在代码中没有传递content-type这个参数,可是抓包是有这个参数的,因此这个参数咱们必定不能加
实际抓包有这个参数
四、实际上传抓包验证便可,和浏览器上传略有不一样,可是不影响上传