关于python:Flask下载文件

Flask Download a File

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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中,我有:

1
<td>Facture</td>

和下载视图:

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

但它正在返回:

Not Found

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

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


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

最好的方法是将UPLOAD_FOLDER配置为相对路径(没有前导斜线),然后通过在current_app.root_path之前添加绝对值来使其绝对:

1
2
3
4
@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代码所在的位置。 并非总是如此。


To download file on flask call. File name is Examples.pdf
When I am hitting 127.0.0.1:5000/download it should get
download.

例:

1
2
3
4
5
6
7
8
9
10
11
12
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)


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

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

我的下载代码如下:

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

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

1
2
Download pdf
Download png