使用 cherrypy 下载文件
Download a file using cherrypy
我有一个 cherrypy 服务器,我用它来生成来自客户端的 REST API 请求。
API 中的一种方法不是 return 另一种 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 link(打开一个新的 window,文件内容为 URL)。我不想通过直接从 ajax 函数下载文件来 "solve" 问题,因为它必须通过 cherrypy 生成。
有人知道这是什么问题吗?
当您为 window.open
查看此 content 时,您将看到第一个参数是要在弹出窗口 window 中打开的 url 因此您的弹出窗口 window 如果您没有在 cherrypy 端设置 content-type 响应 header,自然会打开您的 CSV 内容。如果你想显示文件的 link,你需要打开一个空 url 的弹出窗口 window 并将你的 ajax 结果提供给弹出窗口 window,在 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 方面,您需要像这样设置响应 content-type;
cherrypy.serving.response.headers["Content-Type"]='application/octet-stream';
否则,cherrypy 将其设置为 text/html
,以便您的浏览器尝试在弹出窗口中显示它 window
我有一个 cherrypy 服务器,我用它来生成来自客户端的 REST API 请求。
API 中的一种方法不是 return 另一种 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 link(打开一个新的 window,文件内容为 URL)。我不想通过直接从 ajax 函数下载文件来 "solve" 问题,因为它必须通过 cherrypy 生成。
有人知道这是什么问题吗?
当您为 window.open
查看此 content 时,您将看到第一个参数是要在弹出窗口 window 中打开的 url 因此您的弹出窗口 window 如果您没有在 cherrypy 端设置 content-type 响应 header,自然会打开您的 CSV 内容。如果你想显示文件的 link,你需要打开一个空 url 的弹出窗口 window 并将你的 ajax 结果提供给弹出窗口 window,在 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 方面,您需要像这样设置响应 content-type;
cherrypy.serving.response.headers["Content-Type"]='application/octet-stream';
否则,cherrypy 将其设置为 text/html
,以便您的浏览器尝试在弹出窗口中显示它 window