1、使用requests的requests_toolbelt模块 ,需要自行安装。
pip3 install requests-toolbelt
from requests_toolbelt import MultipartEncoder
import requestsm = 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 MultipartEncoderurl = "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 requestsheaders = {'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.AQAYYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtAHhBZjRDL3dBQUFBQUFBQUFDWm1sc1pYTXZRVEl6TVRFMU5qVXpRVGc1Umk4eU1ESTBMekExTHpJMEx6UXlMekV3TVRJM09UWXZZamxoTXpNek5UazNNRGxoTkdObU9EazBaalJtTjJGak5XSmtOV1ppTXpjdVltbHUProcess 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 操作,后者适用于处理二进制数据。