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

萌新提问!: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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler