我正在尝试在JSP servlet应用程序中下载文件。 据我所知,jQuery.get()和window.open()都发送get请求。 我可以使用window.open(CSVURL)轻松下载文件,但是如果我用jQuery.get()尝试相同的东西,它就不会下载。 servlet中的“doGet()函数”运行但没有下载,控制台日志也没有错误。
此代码下载文件
$("#exportcsv").click(function() {
window.open(SomeURL);
});
这不是
$("#exportcsv").click(function() {
jQuery.get(CSVURL,Data).done(function() {});
});
这是我在servlet上的Java下载代码
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
downloadFile(somepath, req, resp);
}
protected void downloadFile(String path, HttpServletRequest req, HttpServletResponse resp) {
File file = null;
InputStream in = null;
ServletOutputStream outstream = null;
try {
String fileName = "csv";
resp.reset();
file = new File(path);
in = new FileInputStream(file);
resp.setContentType("text/csv");
resp.addHeader("content-disposition", "attachment; filename=" + fileName);
outstream = resp.getOutputStream();
IOUtils.copyLarge(in, outstream);
} catch (Exception e) {
log.warn(e.getMessage());
} finally {
IOUtils.closeQuietly(outstream);
IOUtils.closeQuietly(in);
if (file != null)
file.delete();
}
}
答案 0 :(得分:2)
据我所知,jQuery.get()和window.open()都发送get请求。
是的,但有两个显着差异:
jQuery.get
使用ajax,它是Same Origin Policy的子对象。 window.open
没有,也没有。因此,如果请求是针对另一个来源(不同主机,不同端口和/或不同协议)中的URL,则jQuery.get
将在浏览器端失败(默认情况下; CORS可用于服务器允许它,但window.open
不会。
我不认为jQuery.get
会触发浏览器对Content-Disposition: attachment; ...
标题的默认处理。
问题可能是由标题引起的。您能否建议在不打开新标签的情况下下载文件的任何解决方法?
我通常触发文件下载的方式是将表单(因为我通常需要POST)发布到隐藏的iframe。在Chrome和Firefox上,它不会打开任何窗口;在IE上,它确实如此,但仅在“另存为”对话框出现之前短暂。
对于GET请求,我相信您可以使用a
和download
attribute动态添加href
元素并人为点击它:
var a = $("<a download></a>")
.attr("href", theURL)
.css("display", "none")
.appendTo(document.body)
.click();
setTimeout(function() {
a.remove();
a = undefined;
}, 500);
......或者其他类似的东西。它必须在Firefox的文档中处理它。其他浏览器似乎也很高兴,即使它不在文档中。