Home Articles

Flask下载文件

Asked
Viewed 641 times
29

我正在尝试使用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 Answers

  • 38

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

  • 3

    我也在开发类似的应用程序 . 即使文件存在,我也没有找到错误 . 这解决了我的问题 . 我在'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>
    
  • 1

    在烧瓶电话上下载文件 . 文件名是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)
    

Related