如果 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 在现有窗口中下载文件的主要内容,如果未能解决你的问题,请参考以下文章
如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]
如果Java应用程序不在预定义的目录中,如何防止(以编程方式)启动它? [复制]