如果 java 以“content-disposition”、“attachment;filename=FileName.xls”的形式发送响应,如何通过 ajax 在现有窗口中下载文件

Posted

技术标签:

【中文标题】如果 java 以“content-disposition”、“attachment;filename=FileName.xls”的形式发送响应,如何通过 ajax 在现有窗口中下载文件【英文标题】:How to download file in the existing window through ajax if the java is sending response as "content-disposition", "attachment;filename=FileEName.xls" 【发布时间】:2015-11-07 12:03:23 【问题描述】:

Java 正在使用 Apache POI 生成 excel 文件,他们正在发送文件作为响应,响应头为“content-disposition”、“attachment;filename=FileEName.xls”。

在 UI 中,我正在执行 ajax 调用并获取文件类型数据。如何使该文件可在同一选项卡中下载?

【问题讨论】:

【参考方案1】:

一种方法是生成一个锚标记并将href 属性设置为返回文件数据的端点。

这允许浏览器正确处理content-disposition 标头,从而按预期显示浏览器特定的文件下载对话框。

【讨论】:

【参考方案2】:

XHR 请求无法显示浏览器文件下载对话框,为此您应将 excel 文件保存在临时目录中,然后从 API 控制器返回文件地址。使用来自 API 控制器的返回值,只需使用 TempName 调用下面的函数(来自 API 控制器的返回值)

        function getExcelFile(tempName) 
            var frmWindow = getIFrameWindow(tempName);
            var frm = frmWindow.document.getElementById("frmFile");
            frm.submit();
        
        function getIFrameWindow(tempName) 
            // Remove the old iframe
            var oldIFrame = document.getElementById("fileFrame");
            if (oldIFrame) 
                document.body.removeChild(oldIFrame);
            
            // Create a new iframe
            createFrame(tempName);
            var wnd = window.frames["fileFrame"];
            return wnd;
        
        function createFrame(tempName) 
            var frame = document.createElement("iframe");
            frame.name = "fileFrame";
            frame.id = "fileFrame";

            document.body.appendChild(frame);
            generateIFrameContent(tempName);
            frame.style.width = "0px";
            frame.style.height = "0px";
            frame.style.border = "0px";
        

        function generateIFrameContent(tempName) 
            var frameWindow = window.frames["fileFrame"];
            var content = "<form id='frmFile' method='get' enctype='application/data' action='/Temp/" + tempName + "'></form>";
            frameWindow.document.open();
            frameWindow.document.write(content);
            frameWindow.document.close();
        

【讨论】:

以上是关于如果 java 以“content-disposition”、“attachment;filename=FileName.xls”的形式发送响应,如何通过 ajax 在现有窗口中下载文件的主要内容,如果未能解决你的问题,请参考以下文章

将base 64编码字符串转换为图像

如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]

如果Java应用程序不在预定义的目录中,如何防止(以编程方式)启动它? [复制]

Java - 如果单词以用户输入的分隔符结尾,则执行 x

Java以缓冲字符流向文件写入内容(如果文件存在则删除,否则先创建后写入)

如何在 Java 中偏移日期以适应 DST