如何通过requests.post发送opencv读取的numpy array格式图像到服务器
OpenCV读取的视频帧直接通过requests上传到服务器的解决方案
问题原因
你遇到的问题本质是requests库对files参数的处理规则差异:
- 传入
open()返回的io.BufferedReader对象时,requests会自动提取文件名、推断文件MIME类型,补全上传请求的文件字段元信息,符合大多数后端的文件上传校验规则 - 直接传入原始字节串时,
requests不会为该字段附加文件名、MIME类型等元信息,后端会将其识别为普通表单字段,而非上传的图片文件,因此返回异常
你不需要强行将字节转为io.BufferedReader类型,使用io.BytesIO包装编码后的图片字节得到类文件对象,就可以被requests正确识别。
解决方案
使用io.BytesIO包装编码后的图片字节,同时显式指定上传文件的文件名和MIME类型,适配后端校验规则。
完整代码示例
import cv2 import numpy as np import requests import io # 替换为你的实际参数 vid = cv2.VideoCapture(0) url = "你的上传接口地址" user = "你的接口认证账号" pwd = "你的接口认证密码" ret, frame = vid.read() if not ret: raise ValueError("视频帧读取失败") # 将帧编码为jpg格式,可添加参数[cv2.IMWRITE_JPEG_QUALITY, 90]调整输出画质 encode_ret, img_encode = cv2.imencode('.jpg', frame) if not encode_ret: raise ValueError("图像编码失败") # 包装为类文件对象 img_file = io.BytesIO(img_encode.tobytes()) # 发起请求,files字段格式为(文件名, 文件对象, MIME类型),可根据后端要求调整参数 rsp = requests.post( url, auth=(user, pwd), files={'img': ('capture.jpg', img_file, 'image/jpeg')} ) # 验证响应结果 print(rsp.status_code) print(rsp.text)
内容的提问来源于stack exchange,提问作者guestgermany
相关产品推荐
相关产品推荐

