Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用cherrypy下载文件_Javascript_Ajax_Cherrypy - Fatal编程技术网

Javascript 使用cherrypy下载文件

Javascript 使用cherrypy下载文件,javascript,ajax,cherrypy,Javascript,Ajax,Cherrypy,我有一个cherrypy服务器,我使用它从客户端生成RESTAPI请求 API中的一个方法不会像另一个方法一样返回JSON,而是一个CSV文件 /myMethod/report/?name=a&fromRow=1&toRow=1000 我想通过单击按钮从客户端下载此文件。然而,它必须通过cherrypy传递,而不是直接从客户端传递 以下是我的ajax函数: function myReport(name){ $.ajax( { url : '/m

我有一个cherrypy服务器,我使用它从客户端生成RESTAPI请求

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
的实际值是CSV文件的内容,而不是指向该文件的URL链接(打开一个新窗口,文件内容为URL)。我不想通过直接从ajax函数下载文件来“解决”这个问题,因为它必须通过cherrypy生成

有人知道问题出在哪里吗?

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

var newWindow=window.open("", "Statistics Report", "width=800, height=200", true);
newWindow.document.body.innerHTML='<a href="'+data+'">'+data+'</a>';
但在cherrypy方面,您需要像这样设置响应内容类型

cherrypy.serving.response.headers["Content-Type"]='application/octet-stream';
否则,cherrypy将其设置为
text/html
,以便浏览器尝试在弹出窗口中显示它

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