python經過http(multipart/form-data)上傳文件的方法

以前寫過一篇博客,說的如何python如何經過http下載文件,今天寫一篇博客來介紹以下,python如何經過request庫實現上傳文件php

這裏主要是解決multipart/form-data這種格式的文件上傳,基本如今http協議上傳文件基本上都是經過這種格式上傳html

1、思路

通常狀況下,若是咱們往一個地址上傳文件,則必需要登錄,登錄成功後,拿到cookies,而後在上傳文件的請求攜帶這個cookies。python

而後咱們就須要經過瀏覽器在網站上傳文件,記得,這個時候抓包要使用fiddler工具,會更加保險,而後按照fiddler抓到包組裝咱們的上傳文件的post請求web

你們把握一個原則就是:在post請求中,用files參數來接受文件對象相關的參數,經過data/json參數接受post請求體的其餘參數便可。json

2、實現

一、使用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這個參數,可是抓包是有這個參數的,因此這個參數咱們必定不能加

 

 

 實際抓包有這個參數

 

 

四、實際上傳抓包驗證便可,和瀏覽器上傳略有不一樣,可是不影響上傳

相關文章
相關標籤/搜索