如何将 request.files 保存在 Python Flask 中 send_file 拉取的同一位置

问题描述 投票:0回答:1

我有两个用 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)
将文件保存在以下位置:

  • 项目文件夹
    • 上传_文件夹<-- here
    • web_app_folder
      • 应用程序.py

当我稍后尝试使用

send_file(path)
函数从完全相同的路径中拉出时,它会尝试从以下位置拉出:

  • 项目文件夹
    • web_app_folder
      • 上传_文件夹<-- here
      • 应用程序.py

请注意,上传文件夹现在位于 Web 应用程序文件夹内。

是什么导致这些函数从不同的位置提取/保存到不同的位置,即使它们被告知要提取/保存到完全相同的路径?重要的是,如何让 send_file 从与 file.save 相同的路径中提取?

python flask
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.