繁体   English   中英

Python Flask - 如何使用 send_from_directory 下载文件并在浏览器中显示文本 output

[英]Python Flask - How to download a file with send_from_directory AND display text output in browser

我希望能够在通过 send_from_directory 触发下载后向用户显示一条消息。

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

    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

这将在访问 /downloadFile 端点后触发下载,但除了触发下载外,我还希望浏览器中的 output 显示“文件下载已触发”之类的内容。 有没有办法做到这一点? 如果我没有使用 send_from_directory,我可以做这样的事情来返回一些 JSON return {'Status': 'file download triggered'}

我正在寻找一种将两者结合起来的方法,这样用户在点击此端点时就不会看到空白屏幕。

您可以做的是,在给定端点返回 render_template() 以呈现 html 文件,该文件将显示类似“您的文件正在下载”或您想要的任何消息,并在同一个 html 文件中,使用 JS 触发将下载文件的第二个端点。

@app.route('/downloadPage', methods=['GET'])
def download_page():
    return render_template("download_page.html")

@app.route('/downloadFile')
def download_file():
    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

在 HTML 文件中,JS 将类似于 -

<SCRIPT>
   window.location.href = "/DownloadFile";
</SCRIPT>

编辑 1:

@fpolig01 这是我所做的 -> 我使用 flask 中的 save_file 创建了一个 function 并返回了这个

def download_file():
    return send_file('static/downloads/filename.csv',
                     mimetype='text/csv',
                     as_attachment=True)

在此之后,在您的 app.route() 代码中,将其称为 function。类似于 ->

@app.route('/downloadFile')
def download_file():
    result = download_file()
    return result

在 JS 中,你必须重定向到这个 URI,它会直接开始下载/会显示一个弹出窗口来保存文件。 客户仍然只停留在最后一页。 至少这对我有用。

或者你至少可以做的是,创建一个带有下载文件按钮的 html 页面,将按钮配置为 go 到此下载链接,然后就可以了。

告诉我你做了什么

对于任何请求,只能有一个响应。 HTML 页面响应和文件下载响应必须是它们各自对两个单独请求的响应。

为了获得您想要的效果,您需要两个端点:一个端点返回 HTML 响应,第二个端点处理文件下载。

来自第一个路由的 HTML 响应可以包含javascript 代码以启动从第二个端点下载文件 这个的实现可能看起来接近pushpak ruhil 的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM