You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask结合OpenCV加载上传图片报WinError123错误解决方法

错误原因

你的报错来自参数传递错误:
load_images_from_folder 要求输入的是文件夹的合法路径字符串,但你调用时传入的是str(file)——这里的file是Flask封装的FileStorage上传对象,直接转字符串只会得到<FileStorage: 'xxx.jpeg' ('image/jpeg')>这类对象描述文本,根本不是有效路径,os.listdir自然会报路径语法错误。
另外你的场景是处理用户单次上传的单张图片,完全不需要遍历整个上传文件夹读取所有图片,直接读取你刚保存好的当前上传文件即可,遍历文件夹反而会引入多余IO,还可能读到其他无关图片。

修正后完整代码
import os
import cv2
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename

app = Flask(__name__)
# 用绝对路径配置上传目录,避免工作目录切换导致路径失效
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
app.config['UPLOAD_FOLDER'] = os.path.join(BASE_DIR, 'uploads')
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg'}

# 服务启动时自动创建上传文件夹,无需手动新建
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

def load_images_from_folder(folder):
    images = []
    try:
        for filename in os.listdir(folder):
            file_path = os.path.join(folder, filename)
            # 跳过子目录,只读取文件
            if os.path.isfile(file_path):
                img = cv2.imread(file_path)
                if img is not None:
                    images.append(img)
    except OSError as e:
        print(f"读取文件夹出错: {e}")
    return images

@app.route('/predict', methods=['POST'])
def predict():
    # 校验请求是否携带文件字段
    if 'file' not in request.files:
        return jsonify({"code": 400, "msg": "请求未携带图片文件"}), 400
    file = request.files['file']
    # 校验空文件名
    if file.filename == '':
        return jsonify({"code": 400, "msg": "未选择有效文件"}), 400
    
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        file.save(save_path)
        
        # 单图场景直接读取当前保存的图片,无需遍历文件夹
        image_np = cv2.imread(save_path)
        if image_np is None:
            return jsonify({"code": 500, "msg": "图片读取失败,请检查文件是否损坏"}), 500
        
        # 此处写入你的模型预测逻辑即可
        # predict_result = your_model(image_np)

        return jsonify({"code": 200, "msg": "预测成功", "data": {}})
    
    return jsonify({"code": 400, "msg": "不支持的文件格式,仅允许png/jpg/jpeg"}), 400

if __name__ == '__main__':
    app.run(debug=True)
关键改动点
  • 修复核心传参错误:单图上传场景直接读取当前文件的保存路径,不再错误传入FileStorage对象;如果后续需要批量加载上传目录下的所有图片,直接传入app.config['UPLOAD_FOLDER']调用load_images_from_folder即可
  • 路径逻辑优化:采用基于脚本位置的绝对路径配置上传目录,服务启动时自动创建uploads文件夹,避免相对路径因工作目录变化失效,无需手动新建目录
  • 补全边界校验:新增请求无文件、空文件名、非法格式、图片损坏场景的判断和返回,不会直接抛出系统错误
  • 优化原有批量读函数逻辑:增加文件类型判断,避免把目录当图片读取;新增异常捕获,遇到文件夹无权限、路径不存在的问题不会直接崩溃
  • 后缀校验增加小写转换,避免大写后缀(如.JPG)被误拦截

内容的提问来源于stack exchange,提问作者Leah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:54:14