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
相关产品推荐
相关产品推荐

