Flask中request.files.save与send_file使用同一路径却读写位置不一致的问题排查与解决咨询
Flask中request.files.save与send_file使用同一路径却读写位置不一致的问题排查与解决咨询
嘿,这种明明代码里路径写得一模一样,但实际读写位置却跑偏的问题真的挺闹心的,我之前也碰到过类似的情况!咱们来一步步拆解问题根源和解决办法:
问题根源:工作目录(Working Directory)不一致
你代码里拼接路径用的是current_app.config['UPLOAD_FOLDER'],如果这个配置项是相对路径(比如直接写的'UPLOAD_FOLDER'),那实际解析出来的绝对路径会依赖Flask运行时的工作目录——也就是你启动Flask命令时所在的文件夹。
举个例子:
- 如果你在
project-folder目录下启动Flask(比如跑python web_app_folder/app.py),此时工作目录是project-folder,file.save()会把文件存在project-folder/UPLOAD_FOLDER - 但如果后续启动时不小心切换到了
web_app_folder目录(比如直接跑python app.py),工作目录变成了web_app_folder,send_file()就会去web_app_folder/UPLOAD_FOLDER找文件,自然就找不到了
解决办法:改用绝对路径配置UPLOAD_FOLDER
最稳妥的方式是把UPLOAD_FOLDER配置成绝对路径,让它不依赖启动时的工作目录。你可以基于Flask app所在的目录来构建这个绝对路径:
在你的app.py里修改配置部分:
import os from flask import Flask app = Flask(__name__) # 构建绝对路径:从app.py所在的web_app_folder,回到上级的project-folder,再拼接UPLOAD_FOLDER app.config['UPLOAD_FOLDER'] = os.path.abspath( os.path.join(os.path.dirname(__file__), '..', 'UPLOAD_FOLDER') ) # 提前创建上传目录,避免保存文件时出错 os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
解释一下这段代码:
os.path.dirname(__file__):获取当前app.py文件所在的目录(也就是web_app_folder)'..':向上跳一级目录,到project-folderos.path.abspath():把拼接后的路径转换成绝对路径,确保不管在哪启动,路径都是固定的
额外验证步骤
为了确认问题解决,你可以在两个端点里打印出实际的路径值,检查是否一致:
# 在upload端点里添加 print(f"实际上传路径: {path}") # 在get端点里添加 print(f"实际读取路径: {path}")
启动Flask后,观察控制台输出的路径,应该是完全相同的绝对路径,这样读写就不会再出现位置偏差了。
备注:内容来源于stack exchange,提问作者Nicolas Gatien
相关产品推荐
相关产品推荐

