我有一台樱桃服务器,我用它来从客户端生成REST API请求。
API中的一种方法不会返回另一种JSON,而是返回CSV文件。
/myMethod/report/?name=a&fromRow=1&toRow=1000
我想通过单击按钮从客户端下载此文件。但是,它必须通过樱桃,而不是直接从客户端传递。
这是我的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.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生成。
有人知道这是什么问题吗?
答案 0 :(得分:2)
当您为window.open
查看此content时,您会看到第一个参数是在弹出窗口中打开的网址,因此如果您未设置内容类型,则弹出窗口会自然打开您的CSV内容在cherrypy方面的响应标题。如果要显示文件的链接,则需要打开一个带有空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.serving.response.headers["Content-Type"]='application/octet-stream';
否则,cherrypy将其设置为text/html
,以便您的浏览器尝试在弹出窗口中显示它