You need to enable JavaScript to run this app. Flask通过POST请求上传图片触发FileNotFoundError的路径配置问题
优惠活动
大模型
产品
解决方案
定价
更多

Flask通过POST请求上传图片触发FileNotFoundError的路径配置问题

报错核心原因

根据日志最后抛出的异常FileNotFoundError: [Errno 2] No such file or directory: 'app/static/uploads/testpic.jpg',问题根本不是路径字符串拼错。你之前反复调整路径字符串(比如换成/app/static/uploads、linebot/static/uploads)都没解决,就是因为核心矛盾从来不是路径字符串的匹配度,而是static/uploads这一级的目录在服务器上根本不存在。Python的文件写入操作不会自动创建多级父目录,直接调用file1.save()的时候就会因为找不到对应的文件夹抛出异常。

具体修复操作
  • 给上传目录补自动创建逻辑
    目前你的代码只是拼接了UPLOAD_FOLDER的路径,从来没校验这个路径对应的目录是否存在。在配置完UPLOAD_FOLDER的位置追加以下代码,不需要手动调整之前写的路径拼接逻辑:
    import os
    # 已有配置代码
    UPLOAD_FOLDER = os.path.join(APP_ROOT, 'static/uploads')
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    # 新增自动创建目录的逻辑
    if not os.path.exists(UPLOAD_FOLDER):
        os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    
  • 修正GET请求分支的隐式报错
    现有路由的GET分支里直接把file1变量传给模板,但这个变量是在POST请求分支内部定义的。直接通过浏览器访问这个路由的GET地址时,会触发未定义变量的异常。可以把变量初始化逻辑挪到分支外层:
    @app.route('/post_pic',methods=['POST','GET'])
    def post_picture():
        file1 = None # 外层初始化变量
        if request.method == 'POST':
            file1 = request.files['image']
            # 增加空文件名校验,避免异常值
            if not file1.filename:
                return jsonify({"success": "false", "msg": "无效的上传文件"})
            save_path = os.path.join(app.config['UPLOAD_FOLDER'], file1.filename)
            file1.save(save_path)
            return jsonify({"success": "true"})
        return render_template("show_pic3.html", file1=file1)
    
  • Heroku运行环境的特殊注意事项
    Heroku的本地文件系统是临时的,每次应用重新部署、dyno重启的时候,所有写入到本地目录的文件都会被清空。如果上传的图片需要长期留存,不能存在本地static目录下;如果只是上传后做临时处理(比如图像识别、格式转换),处理完就不需要留存的场景,这套本地存储逻辑是可以正常运行的。
容易遗漏的细节
  • 不要尝试把本地空的uploads文件夹手动推到Heroku仓库:git默认不追踪空目录,哪怕本地建了文件夹,部署到线上之后还是空的,必须靠代码运行时自动创建目录。
  • 修改完代码后要重新push到Heroku触发重新部署,不然线上运行的还是原来的旧代码,改了本地逻辑也不会生效。
  • 不要硬编码类似/app/static/uploads的绝对路径,换运行环境就会失效,原来基于__file__拼路径的方式本身是更通用的写法,只要补上目录自动创建的逻辑就可以正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:06:03