[英]How to download a file from Flask with send_from_directory?
[英]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.