需求是一个简单的页面,用户输入要想查询数据的时间(如:2019-03-31) 然后后端收到数据,从数据库等地方获取数据 处理之后 做成pandas的dataframe,然后pandas的to_excel 生成Excel文件保存在服务端中,用户点击下载按钮 下载文件。
现在遇到的问题是:
请求能成功,状态码200 但是无法下载文件。
跪求大佬!!
这是后端代码
@app.route('/')
def html():
return render_template('download.html')
@app.route('/download', methods=['POST'])
def downloads(time):
# 获取时间数据
time = request.args.get()
print(time)
# filename=StringIO()
# time = request.get_json()["time"]
print(time)
filename = "{}.xlsx".format(time)
writer = pd.ExcelWriter(filename)
# df3,df2,df4 是通过时间从数据库获取的数据 转dataframe
df3,df2,df4 = get_excel(time)
gc = GetCount(time)
# hb_df,sc_df 同上 获取数据转dataframe
hb_df = gc.get_hb_uv()
sc_df = gc.get_sc_uv()
df3.to_excel(writer,sheet_name="1-{}".format(time), index=False)
df2.to_excel(writer,sheet_name="2-{}".format(time), index=False)
df4.to_excel(writer,sheet_name="3-{}".format(time), index=False)
hb_df.to_excel(writer,sheet_name="4-{}".format(time), index=False)
sc_df.to_excel(writer,sheet_name="5-{}".format(time), index=False)
writer.save()
if os.path.isfile(os.path.join(basedir, filename)):
print(os.path.join(basedir, filename))
response = make_response(send_from_directory(basedir, filename, as_attachment=True))
response.headers["Content-Disposition"] = "attachment; filename={}".format(filename)
return response
这是前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>数据下载</title>
<style>
.main {
margin: 100px auto;
width: 500px;
border: 1px solid #ddd;
border-radius: 5px;
padding: 100px 50px;
}
</style>
</head>
<body>
<div class="main">
<h2>数据下载</h2>
<span>请输入要查询的时间:</span><input type="text" placeholder="时间格式为:2019-01-01" id="time">
<br>
<button type="button" onclick="download()">下载数据</button>
</div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
function download(){
var params = {
time: $('#time').val()
};
if($('#time').val() === '') {
alert('请输入时间')
} else {
$.ajax({
type: 'post',
url: '/download',
data: JSON.stringify(params),
contentType: "application/json",
datatype: 'json',
success: function(data){
},
error: function(err){
alert('出错了:' + err)
}
})
}
}
</script>
</html>
首先看一下流是否有返回给浏览器, 没有就是后端有问题
有的话, 就找你们前端, 需要接收一下
接口请求
createExportTask: {
// url: '/core/common/createExportTask',
url: '/export/generateExportFile',
method: 'post',
responseType: 'blob',
callback: function (res, resolve, reject) {
/* 请求成功 */
if (res.status === 200) {
resolve(res)
} else {
/* 请求失败 */
reject(res)
}
}
}
//返回文件处理
this.$http.fetch(this.createExportTaskApi, this.handleSubmitParams(this.params))
.then((res) => {
let blob = new Blob([res.data])
let reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = (e) => {
let a = document.createElement('a')
/* 默认文件名 */
a.download = `文件名.xlsx`
a.href = e.target.result
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
this.onClose()
}
}).catch((resp) => {
this.$notify.error(resp.msg || '导出文件失败')
}).finally(() => {
this.confirmBtnLoading = false
})