一尘不染

flask下载文件

flask

我正在尝试使用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。如果您手动输入网址,请检查拼写,然后重试。

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


阅读 1192

收藏
2020-04-06

共1个答案

一尘不染

你需要确保传递给directory参数的值是绝对路径,并已针对应用程序的当前位置进行了更正。

最好的方法是将其配置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(directory=uploads, filename=filename)

重申这一点很重要,这一点UPLOAD_FOLDER必须相对,例如,不能以开头/。

相对路径可能有效,但在很大程度上取决于将当前工作目录设置为Flask代码所在的位置。并非总是如此。

2020-04-06