Flask 下载文件

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

我正在尝试使用 Flask 创建一个 Web 应用程序,让用户上传文件并将其提供给另一个用户。现在,我可以正确地将文件上传到upload_folder。但我似乎找不到办法让用户下载回来。

我将文件名存储到数据库中。

我有一个为数据库对象提供服务的视图。我也可以删除它们。

@app.route('/dashboard', methods=['GET', 'POST'])
def dashboard():

    problemes = Probleme.query.all()

    if 'user' not in session:
        return redirect(url_for('login'))

    if request.method == 'POST':
        delete = Probleme.query.filter_by(id=request.form['del_button']).first()
        db.session.delete(delete)
        db.session.commit()
        return redirect(url_for('dashboard'))

    return render_template('dashboard.html', problemes=problemes)

在我的 HTML 中我有:

<td><a href="{{ url_for('download', filename=probleme.facture) }}">Facture</a></td>

和下载视图:

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    return send_from_directory(directory=app.config['UPLOAD_FOLDER'], filename=filename)

但它又回来了:

未找到

在服务器上找不到请求的 URL。如果您手动输入 URL,请检查拼写并重试。

我只想将文件名链接到对象并让用户下载它(对于同一视图中的每个对象)

python flask download flask-sqlalchemy
5个回答
107
投票

您需要确保传递给

directory
参数的值是绝对路径,并根据应用程序的 current 位置进行更正。

执行此操作的最佳方法是将

UPLOAD_FOLDER
配置为相对路径(无前导斜杠),然后通过添加
current_app.root_path
将其设置为绝对路径:

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    uploads = os.path.join(current_app.root_path, app.config['UPLOAD_FOLDER'])
    return send_from_directory(uploads, filename)

需要重申的是,

UPLOAD_FOLDER
必须是相对的才能起作用,例如不以
/
开头。

相对路径可以工作,但过于依赖当前工作目录设置为 Flask 代码所在的位置。情况可能并不总是如此。


100
投票

在 Flask 调用上下载文件。 文件名为 Examples.pdf 当我点击 127.0.0.1:5000/download 时,它应该得到 下载。

示例:

from flask import Flask
from flask import send_file
app = Flask(__name__)

@app.route('/download')
def downloadFile ():
    #For windows you need to use drive name [ex: F:/Example.pdf]
    path = "/Examples.pdf"
    return send_file(path, as_attachment=True)

if __name__ == '__main__':
    app.run(port=5000,debug=True) 

10
投票

file.html
创建所提供文件的列表。

<ul>
    {% for file in files %}
        <li> 
            <a href="{{ url_for('download', filename=file) }}">
                {{ file }}
            </a>
        </li>
     {% endfor %}
</ul>

server.py
在指定的 url 处提供您的目录。

from flask import send_from_directory

app = (__name__)
app.config['UPLOAD_FOLDER'] = 'logs'  # your directory


@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    full_path = os.path.join(app.root_path, app.config['UPLOAD_FOLDER'])
    return send_from_directory(full_path, filename)


8
投票

我也在开发一个类似的应用程序。即使文件在那里,我也收到未找到错误。这解决了我的问题。我在“static_folder”中提到了我的下载文件夹:

app = Flask(__name__,static_folder='pdf')

我的下载代码如下:

@app.route('/pdf/<path:filename>', methods=['GET', 'POST'])
def download(filename):    
    return send_from_directory(directory='pdf', filename=filename)

这就是我从 html 调用我的文件的方式。

<a class="label label-primary" href=/pdf/{{  post.hashVal }}.pdf target="_blank"  style="margin-right: 5px;">Download pdf </a>
<a class="label label-primary" href=/pdf/{{  post.hashVal }}.png target="_blank"  style="margin-right: 5px;">Download png </a>

0
投票

尝试这个(假设 UPLOAD_FOLDER 相对于您的工作目录)。

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    path = os.path.join(os.getcwd(), app.config['UPLOAD_FOLDER'])
    return send_from_directory(directory=path, filename=filename)
© www.soinside.com 2019 - 2024. All rights reserved.