jQuery.get vs window.open的区别

时间:2017-11-20 07:35:51

标签: jquery window.open

我正在尝试在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();
        }
    }

1 个答案:

答案 0 :(得分:2)

  

据我所知,jQuery.get()和window.open()都发送get请求。

是的,但有两个显着差异:

  1. jQuery.get使用ajax,它是Same Origin Policy的子对象。 window.open没有,也没有。因此,如果请求是针对另一个来源(不同主机,不同端口和/或不同协议)中的URL,则jQuery.get将在浏览器端失败(默认情况下; CORS可用于服务器允许它,但window.open不会。

  2. 我不认为jQuery.get会触发浏览器对Content-Disposition: attachment; ...标题的默认处理。

  3.   

    问题可能是由标题引起的。您能否建议在不打开新标签的情况下下载文件的任何解决方法?

    我通常触发文件下载的方式是将表单(因为我通常需要POST)发布到隐藏的iframe。在Chrome和Firefox上,它不会打开任何窗口;在IE上,它确实如此,但仅在“另存为”对话框出现之前短暂。

    对于GET请求,我相信您可以使用adownload 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的文档中处理它。其他浏览器似乎也很高兴,即使它不在文档中。