发送http请求时,以form-data的格式作为requests的参数

1、使用requests的requests_toolbelt模块 ,需要自行安装。

pip3 install requests-toolbelt

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(
    fields={'field0': 'value',
           'field1': 'value',
            'field2': ('文件名称', open('文件地址/file.py', 'rb'), 'text/plain')}
    )

r = requests.post('http://httpbin.org/post',
                  data=m,
                  headers={'Content-Type': m.content_type})

请注意,必须在请求头中设置Content-Type为encoder.content_type,以确保服务器能
够正确解析请求。



import requests
from requests_toolbelt import MultipartEncoder

url = "https://order-xxxxx/api/admin/file/upload.htm"
params = {"wenaho": 1}


m = MultipartEncoder(fields={'voucher': (open('img/23.jpg', 'rb'), 'image/jpeg')})

response = requests.post(url, params=params, data=m, headers={'Content-Type': m.content_type})

print(response.text)

方法二:

在 requests 中,使用 files 参数上传文件时,其格式应该是一个字典,其中键表示字段名,值是包含文件数据的元组。每个元组通常包含两个或三个元素:文件名、文件对象以及可选的 MIME 类型。

下面是一个示例:

files = { 'file_field_name': ('filename', open('path_to_file', 'rb'), 'media_type') }

  • 'file_field_name' 是要发送文件的字段名。
  • ('filename', open('path_to_file', 'rb'), 'media_type') 是一个元组,其中:
    • 'filename' 是文件名。 'filename' 文件名不能缺少,新版 requests库会报错
    • open('path_to_file', 'rb') 是打开并读取文件的文件对象。
    • 'media_type' 是文件的 MIME 类型(可选)。

请根据你具体的场景和需求,将这些值替换为你实际使用的字段名、文件名、文件对象和 MIME 类型。

import requests


headers = {
        'x-sso-token': "9670b80",
        'user-agent': 'Mozilla/5.0 (Linux; Android 12; M2012K11AC Build/SKQ1.211006.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/95.0.4638.74 Mobile Safari/537.36',
    }

# 上传图片
params = {
        'wenaho': '1',
    }
with open('img/23.jpg', 'rb') as file:
    file_stream = file.read()   #    file_stream 表示一个 <class 'bytes'> 类型的对象

print(open('img/23.jpg', 'rb'))  # <_io.BufferedReader name='img/23.jpg'>

files = {
        # 'bucket': (None, 'exam-room'),
        # 'type': (None, 'image'),
        'voucher': ('23.jpg',open('img/23.jpg', 'rb'), 'image/jpeg'),  # 不能使用file_stream 会报错
    }


res = requests.post(
        'https://ordeXXX.cn/api/admin/file/upload.htm',
        params=params,
        headers=headers,
        files=files
    )
print("上传图片后单响应内容:")
print(res.json())
    # 提取售后单号
imgKeyList = jsonpath.jsonpath(res.json(), "$..encodedData")[0]

print(imgKeyList)

 执行结果:

D:\MC\venv\Scripts\python.exe D:/MC/test01.py
<_io.BufferedReader name='img/23.jpg'>
上传图片后单响应内容:
{'data': {'encodedData': 'dXADAAAAMgAAAAAAD3Q8.AQAYYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtAHhBZjRDL3dBQUFBQUFBQUFDWm1sc1pYTXZRVEl6TVRFMU5qVXpRVGc1Umk4eU1ESTBMekExTHpJMEx6UXlMekV3TVRJM09UWXZZamxoTXpNek5UazNNRGxoTkdObU9EazBaalJtTjJGak5XSmtOV1ppTXpjdVltbHU', 'previewUrl': None}, 'errorCode': 0, 'message': None, 'success': True}
dXADAAAAMgAAAAAAD3Q8.AQAYYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtAHhBZjRDL3dBQUFBQUFBQUFDWm1sc1pYTXZRVEl6TVRFMU5qVXpRVGc1Umk4eU1ESTBMekExTHpJMEx6UXlMekV3TVRJM09UWXZZamxoTXpNek5UazNNRGxoTkdObU9EazBaalJtTjJGak5XSmtOV1ppTXpjdVltbHU

Process finished with exit code 0

<_io.BufferedReader name='img/23.jpg'><class 'bytes'> 是两种不同的对象,它们的区别如下:

  • <_io.BufferedReader name='img/23.jpg'> 表示一个文件对象,通过 Python 的 io 模块打开了一个名为 'img/23.jpg' 的文件。这个对象允许你以文件流(stream)的形式来读取文件的内容,并且保留了文件的元数据(例如文件名、文件路径等)。你可以使用这个文件对象来进行文件读取操作,也可以将它传递给其他需要文件对象作为参数的函数。

  • <class 'bytes'> 表示一个 bytes 类型的对象,是 Python 中用于表示二进制数据的一种数据类型。它包含了一系列的字节(byte),常用于处理文件内容、网络数据传输、加密算法等场景。你可以对 bytes 对象进行切片、拼接、编码解码等操作。

因此,<_io.BufferedReader name='img/23.jpg'> 是一个文件对象,而 <class 'bytes'> 是表示二进制数据的对象,两者在概念上和用途上有所不同。前者适用于文件的 I/O 操作,后者适用于处理二进制数据。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值