我有两个用 python Flask 制作的端点,第一个端点允许用户将文件上传到服务器并将名称添加到数据库。第二个从数据库中获取名称并尝试返回具有该名称的文件。
两个端点都使用 Flask 提供的函数,但它们尝试从不同的目录中拉取。
这是我的第一个端点的简化版本:
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
filename = secure_filename(file.filename)
path = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
file.save(path)
saved_file: SavedFile = SavedFile(
filename=filename
)
db.session.add(saved_file)
db.session.commit()
return "Uploading File"
这是我的第二个端点:
@app.route('/get/<string:name>', methods=['GET'])
def get(name: str):
saved_file: SavedFile = SavedFile.query.filter_by(filename=name).first()
path = os.path.join(current_app.config['UPLOAD_FOLDER'], saved_file.filename)
return send_file(path, as_attachment=True)
特别注意,在两个端点中,路径变量的定义方式完全相同。它将
UPLOAD_FOLDER
中的 current_app
与 filename
连接起来。
但是,当我第一次使用请求上传文件时:
file.save(path)
将文件保存在以下位置:
当我稍后尝试使用
send_file(path)
函数从完全相同的路径中拉出时,它会尝试从以下位置拉出:
请注意,上传文件夹现在位于 Web 应用程序文件夹内。
是什么导致这些函数从不同的位置提取/保存到不同的位置,即使它们被告知要提取/保存到完全相同的路径?重要的是,如何让 send_file 从与 file.save 相同的路径中提取?
将
os.path.abspath
添加到 send_file
请求中,通过从我的问题中描述的第一个文件夹位置提取 send_file
请求,解决了我的问题。
第二个端点变为:
@app.route('/get/<string:name>', methods=['GET'])
def get(name: str):
saved_file: SavedFile = SavedFile.query.filter_by(filename=name).first()
path = os.path.join(current_app.config['UPLOAD_FOLDER'], saved_file.filename)
return send_file(os.path.abspath(path), as_attachment=True)