Javascript 经过身份验证的AJAX文件下载
我正在将内部网与文档管理系统集成。DMS有一个SOAP API。我们构建了一个客户端,它接收REST调用,进行SOAP调用,并返回JSON或文档数据 问题是所有AJAX文件下载解决方案似乎都使用了iFrame(请参阅) 我不能使用它,因为我需要在头中提供身份验证凭据。我能想到的唯一其他可能的解决方案是使用Javascript 经过身份验证的AJAX文件下载,javascript,ajax,download,Javascript,Ajax,Download,我正在将内部网与文档管理系统集成。DMS有一个SOAP API。我们构建了一个客户端,它接收REST调用,进行SOAP调用,并返回JSON或文档数据 问题是所有AJAX文件下载解决方案似乎都使用了iFrame(请参阅) 我不能使用它,因为我需要在头中提供身份验证凭据。我能想到的唯一其他可能的解决方案是使用窗口。打开(如果我能通过浏览器弹出窗口阻塞) 是否有人有其他可能的解决方案,或者如何使用window.open实现此目的 谢谢我认为这个问题没有客户端解决方案窗口。打开不允许您设置请求头。您需要
窗口。打开(如果我能通过浏览器弹出窗口阻塞)
是否有人有其他可能的解决方案,或者如何使用window.open实现此目的
谢谢我认为这个问题没有客户端解决方案<代码>窗口。打开
不允许您设置请求头。您需要向服务器发送cookie或其他值,并添加服务器端代码,以减少对请求头的需求
请参阅以下问题的答案:
我成功地做到了这一点。我是我的例子,我使用的是基本身份验证,但是您可以用不同的值替换授权头(例如,您可以用
值替换它)
下面是代码片段
$(文档)。在(“单击”上,“#btn”,函数(){
var username=“yourUserNameForBasicAuthentication”;
var password=“您的密码用于基本身份验证”
控制台日志(“点击按钮”);
var request=new XMLHttpRequest();
打开(“GET”,$(“#txtUrl”).val().trim(),true);
//设置授权标头
request.setRequestHeader(“授权”,“基本”+窗口.btoa(用户名+”:“+密码));
//将响应类型设置为blob,表示原始数据
request.responseType=“blob”;
//如果以后从HTTP请求的头中检测不到任何文件名,我们将启动一个默认文件名
var fileName=“unnamed.pdf”;
request.onload=函数(事件){
如果(request.status==200){
console.log(“收到成功响应”);
var blob=request.response;
//从响应头获取contenttype
var contentType=request.getResponseHeader(“内容类型”);
if(contentType==null){
contentType=“application/pdf”;
}
//检查“内容处置”标题以获取文件名(如果可能)
if(request.getResponseHeader(“内容处置”)){
var contentDisposition=request.getResponseHeader(“内容处置”);
fileName=contentDisposition.substring(contentType.indexOf(“=”)+1);
}
if(window.navigator.msSaveOrOpenBlob){
//Internet Explorer
window.navigator.msSaveOrOpenBlob(新Blob([Blob]){
类型:contentType
}),文件名);
}否则{
var el=document.createElement(“a”);
文件.正文.附件(el);
el.href=window.URL.createObjectURL(blob);
el.download=文件名;
el.click();
el.移除();
window.URL.revokeObjectURL(el.href);
}
}//状态代码结束
否则{
警报(“系统验证失败”);
}
}//事件结束
request.send();
});
@n1ckolas他不是在说下载,而不是上传吗?你是在使用jQuery还是不使用jQuery?的确。对不起,我的错。是的,我确实在寻找下载。@ryan是的,我在使用jQuery。也许我误解了,但你在发送
属性之前看过标题或了吗?谢谢。我突然想到,我可能已经看过了我必须建立一个临时URL来为文件提供服务,并将用户指向该文件。我要看看它们是否有任何替代方案,并将它们发布在这里我发现了。唉,我们通过下载pdf数据获得了成功,但现代浏览器还没有达到我们可以对二进制文件执行此操作的程度……至少我在数小时的挖掘后发现了这一点。我没有o临时提供文件,并在AJAX响应中发送文档URL。谢谢。I second@EricH。目前唯一的方法是创建一个具有唯一和随机URI的临时文件,通过AJAX请求将其发送回,并在第二次链接单击或浏览器重定向时下载文件。不过,新路径不应具有任何身份验证