Python はリクエストを使用してポストリクエストを送信し、ファイル (multipart/form-data) をアップロードします

目次

1. 背景

2. ファイルをアップロードするためのリクエストインターフェイス

        2.1. 分析インターフェース

        2.2、Pythonリクエスト

3. まとめ


1. 背景

        また、数日前には、ファイルを自動的にアップロードするという要件がありました。具体的には、ファイルをシステムにアップロードし、返された結果を受け取ります。Python のリクエストの使用を検討する 一般に、ファイルのクエリまたはアップロードのインターフェイスはポスト リクエストです。したがって、リクエストのポストリクエストを直接使用してください。ただし、開発プロセス中には、いくつかの問題に注意する必要があります。だからここに記録してください。

2. ファイルをアップロードするためのリクエストインターフェイス

        2.1. 分析インターフェース

                まず、ブラウザ f12 はインターフェイスの内容をチェックします (主にインターフェイス タイプ、リクエスト ヘッダー、およびペイロードに依存します)。ファイルをアップロードするためのインターフェイスはポスト タイプであり、コンテンツ タイプとリクエスト本文の区切り文字を指定するリクエスト ヘッダーの Content-Type も非常に重要であることがわかります。詳細については、以下の図を参照してください。

                 ペイロードはインターフェイスのリクエスト本文です。詳細については、次の図を参照してください。インターフェースパラメータ: type、orgType、file、それぞれ以下の図に対応します。このうち、 file の値は、アップロードしたファイルに対応するパラメータのリクエスト内容(バイナリデータに変換)であり                 、 ------WebKitFormBoundary5rEpBecoRZ2tj60k をセパレータとし、2 つのセパレータの前に 1 つのパラメータが続きます。

        2.2、Pythonリクエスト

# 请求头
'''
    这里注意,要将Content-Type注释掉。因为在请求的时候,会自动加上。
'''
header = {
    'Authorization': '1677034306556',
    'Connection': 'keep-alive',
    # 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryFXTT4S1LKA1LUDBd',
    'Cookie': 'SHIROJSESSIONID=75ace860-0f00-4db0-9440-6c6d53cdf101',
    'Host': 'host:8088',
    'Origin': 'http://host:8088',
    'Referer': 'http://host:8088/njfxq/search/clue/clueFeedBackDetailAll?id=1574192996457648130&Paramspage=clue&caseId=1567439544410976257',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
# 请求体Payload
'''
    这里有必要解释下:
    如果请求体按照页面显示的配置如下:
        fileObject = {
            'type':'6',
            'orgType': 'B',
            'file': open('上传文件.xlsx','rb')
        }
    是错误的(第一次花费半天才调通)
    //
    正确的格式应该是传入一个元组,格式为:(<fileName>,<fileObject>,<Content-Type>) ,这里的fileObject是指具体的值。
    正确的请求体应为:
        fileObject = {
            'type':(None,'6',None),
            'orgType': (None,'B',None),
            'file': ('上传文件.xlsx',open('上传文件.xlsx','rb'),'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        }
'''
fileObject = {
    'type':(None,'6',None),
    'orgType': (None,'B',None),
    'file': ('上传文件.xlsx',open('上传文件.xlsx','rb'),'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
}
req = requests.post('http://host:8088/njfxq/finance/investigatefeedback/uploadFile',headers=header,files=fileObject)
print(req.text)

3. まとめ

        Payloadリクエストボディの変換方法は、以下の図を見るとわかりやすいと思います。

# 下面为补充后的Payload
------WebKitFormBoundarynS4EDa2hdT8tfnF8
Content-Disposition: form-data; name="type"; filename=None
content-type: None

fileObject
------WebKitFormBoundarynS4EDa2hdT8tfnF8
Content-Disposition: form-data; name="orgType"; filename=None
content-type: None

fileObject
------WebKitFormBoundarynS4EDa2hdT8tfnF8
Content-Disposition: form-data; name="file"; filename="样本标签.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet    

fileObject     # 为文件的二进制数据 
------WebKitFormBoundarynS4EDa2hdT8tfnF8--


# 转换为python的请求格式
格式为:'name':(<fileName>,<fileObject>,<Content-Type>)

# 对比如下
fileObject = {
    'type':(None,'6',None),
    'orgType': (None,'B',None),
    'file': ('上传文件.xlsx',open('上传文件.xlsx','rb'),'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
}

おすすめ

転載: blog.csdn.net/zkkkkkkkkkkkkk/article/details/129196847