Content-Type为multipart/form-data时如何从Flask请求对象一次性获取多张图片
多图片文件读取转numpy数组方案
方案1(推荐):直接通过request.files读取独立文件流
request.files原生支持多文件上传读取,不需要手动拆分字节串,操作逻辑如下:
- 前端多文件上传使用同一个字段key,后端通过
request.files.getlist(key)获取该key下所有文件对象,每个对象对应一张独立图片的字节流 - 单文件转
np.ndarray代码示例:
import io import numpy as np from PIL import Image # 替换为实际的上传字段key upload_key = "images" np_images = [] for file_obj in request.files.getlist(upload_key): # 读取单个图片字节流 img_byte = file_obj.read() # 字节流转PIL图像对象 img_pil = Image.open(io.BytesIO(img_byte)) # 转换为numpy数组 img_np = np.array(img_pil) np_images.append(img_np)
方案2(仅应急使用):手动拆分合并后的字节串
如果你已经获取到了多图片拼接后的完整字节串,可通过HTTP表单边界符拆分:
- 首先从请求头
Content-Type字段提取多部分表单的边界标识 - 用边界标识拆分字节串,过滤无效内容后提取单张图片的字节流
- 代码示例:
import io import numpy as np from PIL import Image # 提取边界标识 content_type = request.headers.get("Content-Type") boundary = content_type.split("boundary=")[1].encode() # 拆分合并后的字节串 all_bytes = request.files["your_key"].read() file_parts = all_bytes.split(boundary) np_images = [] for part in file_parts: # 过滤无效片段 if b"Content-Disposition" not in part or b"image/" not in part: continue # 拆分头部信息和图片实际字节 _, img_byte = part.split(b"\r\n\r\n", 1) img_byte = img_byte.rstrip(b"\r\n") # 转numpy数组 img_pil = Image.open(io.BytesIO(img_byte)) np_images.append(np.array(img_pil))
注意:手动拆分边界容易出现编码、换行符兼容问题,优先使用方案1处理多文件上传场景。
内容的提问来源于stack exchange,提问作者bottledmind
相关产品推荐
相关产品推荐

