Javascript 经过身份验证的AJAX文件下载

Javascript 经过身份验证的AJAX文件下载,javascript,ajax,download,Javascript,Ajax,Download,我正在将内部网与文档管理系统集成。DMS有一个SOAP API。我们构建了一个客户端,它接收REST调用,进行SOAP调用,并返回JSON或文档数据 问题是所有AJAX文件下载解决方案似乎都使用了iFrame(请参阅) 我不能使用它,因为我需要在头中提供身份验证凭据。我能想到的唯一其他可能的解决方案是使用窗口。打开(如果我能通过浏览器弹出窗口阻塞) 是否有人有其他可能的解决方案,或者如何使用window.open实现此目的 谢谢我认为这个问题没有客户端解决方案窗口。打开不允许您设置请求头。您需要

我正在将内部网与文档管理系统集成。DMS有一个SOAP API。我们构建了一个客户端,它接收REST调用,进行SOAP调用,并返回JSON或文档数据

问题是所有AJAX文件下载解决方案似乎都使用了iFrame(请参阅)

我不能使用它,因为我需要在头中提供身份验证凭据。我能想到的唯一其他可能的解决方案是使用
窗口。打开
(如果我能通过浏览器弹出窗口阻塞)

是否有人有其他可能的解决方案,或者如何使用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请求将其发送回,并在第二次链接单击或浏览器重定向时下载文件。不过,新路径不应具有任何身份验证