XMLHttpRequest在浏览器中打开PDF

时间:2011-01-20 17:29:58

标签: php html ajax pdf xmlhttprequest

我想做XMLHttpRequest,然后通过POST方法发送文件名,在浏览器中打开PDF。

   xmlhttp.open("POST","pdf.php",true); //CHANGE
   xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
   xmlhttp.send("file="+input);

这是可能的还是XMLHttpRequest只适用于HTML?

4 个答案:

答案 0 :(得分:5)

  1. 如果您要查询的URL实际上返回PDF数据,则无法通过XMLHttpRequest执行。

    为什么呢?因为响应是包含原始PDF数据的HTTP响应。即使您可以通过responseText`属性访问数据,也没有JavaScript能够用当前文档的DOM内容替换该数据中包含的PDF,(参见http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute)。

  2. 您可以做的是将PDF文件生成到可通过Web服务器的URL访问的临时文件中,然后让脚本发回用于访问该文件的URL。

    当您的响应处理程序处理URL时,它可以:

    • 通过更改window.location.href = new_pdf_url

    • 重新加载当前页面
    • 通过更改iframe的<iframe>属性

    • 将其加载到当前文档中的src
    • window.open(new_pdf_url, XXX)

      的单独窗口中打开它

      请注意,您仍然需要一个临时文件位置的URL才能打开一个新窗口

答案 1 :(得分:0)

如果您在同一个窗口中打开PDF,则无需使用XmlHttpRequest,只需从您的javascript中设置window.location(window.location.assign("http://example.com/location/file.pdf")window.location.href="http://etc),而不是调用XmlHttpRequest。 (如果你从XmlHttpRequest收到PDF字节,你怎么说服浏览器用PdfPluginX显示它呢?)

如果您希望在浏览器窗口中使用PDF,只需直接从您的javascript使用window.open(...)

答案 2 :(得分:0)

是的,可以这样做,首先您需要将文件作为 arrayBuffer 获取,然后使用新的 blob 创建一个对象 url,然后分配给 src。

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.type = 'arraybuffer';
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200){
           var blobSrc = window.URL.createObjectURL(new Blob([this.response], { type: 'application/pdf' }));
           // assign to your iframe or to window.open
           yourIframe.src = blobSrc;
        }    

答案 3 :(得分:-1)

你可以尝试这个:

    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200)           {
       var file = window.URL.createObjectURL(xmlHttp.response);
        var a = document.createElement("a");
        a.href = file;      window.open(file);
            }
    }
    xmlHttp.open("GET", '/pdf', true); // true for asynchronous     xmlHttp.responseType= "blob";
    xmlHttp.send(null);