使用javascript在新窗口中打开pdf流

时间:2014-11-11 06:42:01

标签: java javascript ajax struts2 dojo

我正在使用struts2框架和dojo用于ui。我想在新的浏览器窗口中显示pdf。我通过正常的ajax调用get方法从服务器获取pdf inputstream(没有使用dojo ajax调用。使用本机js ajax调用)。
如何在新的浏览器窗口中查看pdf字符串?

js代码:

/ 获取pdf文件的两个输入 /

 var selectedFileSlot={"END407":"report_28_03_13.pdf","END408":"[B@cef121c","END409":"*.pdf;*.doc;*.docx;*.odt;*.ods","END410":"5242880"}
        var selectedNode=   {"objectID":"22df1b2601a3552f24e5f011abc27f86","specID":"2001","entityConcreteID":"11000"}


    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } 
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)  {
          alert(xmlhttp.response);
          window.open(xmlhttp.response);//not able to open in new browser window
      }
    }
    xmlhttp.open("GET","downloadDocument.action?selectedNode=" + JSON.stringify(selectedNode) + "&selectedFileSlot=" + JSON.stringify(selectedFileSlot),true);
    xmlhttp.send();

struts.xml代码:

<action name="downloadDocument" class="commonAction" method="downloadDocument">
    <interceptor-ref name="sessionStack"></interceptor-ref>
    <interceptor-ref name="cachingStack"></interceptor-ref>
    <result name="success" type="stream">
    <param name="contentType">application/octet-stream</param>
    <param name="inputName">inputStream</param>
    <param name="contentDisposition">attachment;filename="${fileFileName}"</param>
    <param name="bufferSize">1024</param>
    </result>
    </action>

动作类代码:

commonDTO.setSelectedNode(this.selectedNode);
commonDTO.setSelectedFileSlot(this.selectedFileSlot);
byte[] bytes = commonDAO.getDownloadDocument(commonDTO); //getting pdf as byte array
inputStream = new ByteArrayInputStream(bytes);

1 个答案:

答案 0 :(得分:0)

这是PDF文件的二进制内容,您无法在Javascript中处理,并且您需要返回application/pdf内容类型(不是text/html或{{1 }}),带有Stream result

为什么你在使用AJAX在新窗口加载 ?只需使用one of the following way即可。