Flask下载文件

时间:2014-07-04 15:23:24

标签: python flask download

我尝试使用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,请检查拼写,然后重试。

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

3 个答案:

答案 0 :(得分:41)

您需要确保传递给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代码所在的位置。情况可能并非总是如此。

答案 1 :(得分:6)

  

要下载烧瓶调用文件。文件名为 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) 

答案 2 :(得分:0)

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


#Python Code

from flask import send_from_directory

app.config['UPLOAD_FOLDER']='logs'


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