EtVzzz 2019-04-08 10:44 采纳率: 0%
浏览 1380

萌新提问!:flask ajax 下载服务端文件,请求能成功,但是文件下载不下来,是为什么?

需求是一个简单的页面,用户输入要想查询数据的时间(如: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>
  • 写回答

1条回答 默认 最新

  • niaonao 2019-04-08 13:15
    关注

    首先看一下流是否有返回给浏览器, 没有就是后端有问题
    有的话, 就找你们前端, 需要接收一下

    接口请求

      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
            })
    
    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100