用户按下页面上form
内的按钮:
<form id="form">
<input type="button" id="export" value="Export"/>
</form>
单击该按钮后,将进行以下Ajax调用:
ajaxCall('/export', {}, callback_export, 'get');
其中
function ajaxCall(url, params, callback, type) {
if (validate()) {
var request;
request = $.ajax({
url: url,
type: type,
data: params
});
}
request.done(function (response, textStatus, jqXHR){
callback(response);
});
}
Flask应用程序如下所示:
@app.route('/export')
def export():
xl_file= '/absolute/path/to/excel/file.xlsx'
return send_file(xl_file, as_attachment=True, mimetype='application/vnd.ms-excel')
文件的文件内容将返回浏览器(请参见下图),但不会将文件本身作为附件返回。
问题是,回调需要什么来接受作为文件附件的响应?或者,需要做出哪些修改?
(是的,我已经搜索并阅读了SE上的很多帖子。大多数人都在讨论使用form.submit()
方法,但没有提供详细信息。我希望避免使用{{1}因为form.submit()
中有其他元素无法提交。)
答案 0 :(得分:6)
你真的需要使用ajax吗?我发现ajax是一个用烧瓶下载excel文件的工作......但它对我没用。 我只需在&#39; rb&#39;中打开excel文件模式和更改mimetype在Windows中被识别为excel文件。你的Flast只需要调用getPlotExcel()。
@app.route("/getPlotExcel")
def getPlotExcel():
excelDownload = open("sample.xlsx",'rb').read()
return Response(
excelDownload,
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-disposition":
"attachment; filename=sample.xlsx"})
答案 1 :(得分:2)
您可以使用Flask的send_from_directory
function
@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
return send_from_directory(directory='uploads', filename=filename)
答案 2 :(得分:0)
我使用了一种不同的方法,而不是Ajax,我创建了一个函数,每次选择更改它时,都会使用一些参数来更新href,在这种情况下为country_id。
HTML:
<a type="button" class="btn btn-sm" id="export-excel" href="#">Download</a>
在脚本部分,我写道:
function country_change(country_id)
{
var param = "/export_excel?";
param += "country_id=" + country_id;
$("a[id='export-excel']").attr('href', param);
}
因此,当您单击按钮时,href已经更新。我的烧瓶部分是:
@app.route('/export_excel')
def export_excel ():
country_id = request.args.get('country_id')
obj = class_calc.calc()
file_excel = obj.generate_excel(country_id)
return send_file(file_excel, as_attachment=True, cache_timeout=0)
工作正常。