【问题标题】:Download a file using cherrypy使用cherrypy下载文件
【发布时间】:2016-02-09 10:00:56
【问题描述】:

我有一个cherrypy 服务器,我用它来从客户端生成REST API 请求。

API 中的一种方法不会像另一种那样返回 JSON,而是返回 CSV 文件。

/myMethod/report/?name=a&fromRow=1&toRow=1000

我想通过单击按钮从客户端下载此文件。但是,它必须通过cherrypy 传递,而不是直接从客户端传递。

这是我的 ajax 函数:

  function myReport(name){
  $.ajax(  {
            url : '/myMethod/myReport?name='+name,
            type: 'POST',
            dataType: "text",
            success:function(data, textStatus, jqXHR) {
                window.open(data, "Statistics Report", "width=800, height=200", true);
            },
            error: function(jqXHR, textStatus, errorThrown)
            {
                alert('error')
            }
    });

  }

这是我的cherrypy函数:

@cherrypy.expose
def myReport(self, name):
    url = "myReport/?name=" + name + "&fromRow=1&toRow=1000"
    htmlText = self.general_url(url)
    cherrypy.response.headers['Content-Type'] = 'application/json'
    return htmlText

htmlText 是文件的URL。我想将此值传递给window.open。但是,传递给 window.open 的实际值是 CSV 文件的内容,而不是文件的 URL 链接(打开一个新窗口,文件内容为 URL)。我不想通过直接从ajax函数下载文件来“解决”这个问题,因为它必须通过cherrypy生成。

有人知道是什么问题吗?

【问题讨论】:

    标签: javascript ajax cherrypy


    【解决方案1】:

    当您查看 window.opencontent 时,您将看到第一个参数是要在弹出窗口中打开的 url,因此如果您没有在cherrypy 中设置内容类型响应标头,您的弹出窗口会自然地打开您的 CSV 内容边。如果要显示文件的链接,则需要打开一个带有空 url 的弹出窗口并将您的 ajax 结果提供给弹出窗口,就像在您的 ajax 调用的成功函数中一样;

    var newWindow=window.open("", "Statistics Report", "width=800, height=200", true);
    newWindow.document.body.innerHTML='<a href="'+data+'">'+data+'</a>';
    

    如果你想显示一个空的弹出窗口然后开始下载;

    newWindow.location.href=data;
    

    但是在cherrypy方面,您需要像这样设置响应内容类型;

    cherrypy.serving.response.headers["Content-Type"]='application/octet-stream';
    

    否则,cherrypy 将其设置为text/html,以便您的浏览器尝试在弹出窗口中显示它

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 2012-08-18
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多