如何使用JavaScript打开文件?

时间:2009-04-17 18:39:31

标签: javascript ajax pdf prototypejs

我有一个servlet,它将pdf文件作为ByteArrayOutputStream写入servlet的输出流。 如果我打开servlet URL,浏览器将打开该文件。 但是如果在servlet上发生错误,浏览器会打开一个带有错误消息的空pdf。 通过ServletResponse发送错误,浏览器将打开默认错误页面。

我想发送错误消息,而不会重定向到错误页面或打开无效的pdf文件。

我试过了:

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            docWindow = window.open('','title');
            docWindow.document.open('application/pdf');
            docWindow.document.write(response);
            docWindow.document.close();
        },
        onFailure: function(response) {
            alert(response);
        }
    });

但是,onSuccess打开一个页面 [对象对象]

如何使用JavaScript打开PDF文件?

4 个答案:

答案 0 :(得分:10)

注意:我假设您正在使用Ajax.Request调用中的Prototype框架。

response object并不是直接编写的,但它具有responseText属性,该属性应包含返回的PDF。

你试过了吗?

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            docWindow = window.open('','title');
            docWindow.document.open('application/pdf');
            document.write(response.responseText);
            docWindow.document.close();
        },
        onFailure: function(response) {
            alert(response);
        }
    });

(注意添加的.responseText

编辑:好的,这样做无效......试试这样的事情:

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            window.open('/pdfservlet');
        },
        onFailure: function(response) {
            alert(response);
        }
    });

这样做是创建ajax请求,如果成功则在新窗口中打开它。打开新窗口应该很快,实际上并不需要再次请求PDF,因为浏览器应该在Ajax.Request调用期间缓存它。

答案 1 :(得分:2)

你可以尝试“两次通过”的方法。您使用Ajax来调用servlet(如果它在运行中生成PDF,请将其缓存)。如果成功,则使用参数将用户重定向到servlet以加载缓存的PDF。

还有其他选项,但这取决于您使用PDF的方式。

我的0.02美元..

答案 2 :(得分:0)

由于您似乎将PDF发送为“内联”而不是“附件”,因此您可以将PDF的网址放入动态创建的iframe中,然后将该iframe附加到叠加层。那会有用。

-jP

答案 3 :(得分:0)

  

但是如果在servlet上发生错误,浏览器会打开一个带有错误消息的空pdf。

在我看来,尝试在服务器端修复此问题比使用AJAX和缓存的所有这些脆弱的东西更好。为什么servlet错误仍然设置'Content-Type:application / pdf'标头及其错误消息?检查servlet中发送内容的顺序;在您成功创建PDF并准备好返回之前,请不要发送“内容类型”。