使用AJAX调用输出存储为BLOB的PDF文件内容,而不创建文件

时间:2011-03-07 07:46:08

标签: java javascript ajax jsp pdf

我需要为点击下载按钮的用户打开一个pdf文件。

下载按钮对servlet进行ajax调用,该servlet从包含PDF内容的数据库中的blob字段获取数据,并将其作为响应返回。

如何将响应作为PDF文件下载给用户,我该怎么做。

servlet代码如下:

                response.setContentType("application/pdf");
                oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF");
                byte[] bytes = blob.getBytes(1, (int) blob.length());
                ServletOutputStream servletOutputStream = response.getOutputStream();
                servletOutputStream.write(bytes, 0, bytes.length);
                servletOutputStream.flush();
                servletOutputStream.close();

当我检查Fire bug以获得响应时,我收到一个长响应,其中包含以下AJAX中的字符。

  

a J 㔎ji 2K y 2 qF f 9 G !% kɂ W mp) {h̕SNJ_A'2kjяR> WBE | = WP%wqǦ>〜1O㾙9JB; aNx3`zطCOI $; N |; Xۇ; - CFMC(六M6K

我不想提交页面或弹出一个servlet窗口,其中包含为URL中显示的查询发送的参数

  

我也不想在服务器上创建文件。

有没有办法在ajax调用中获取servlet的响应并将其显示到页面或iframe,浏览器会自动下载文件...

2 个答案:

答案 0 :(得分:2)

无法使用Ajax下载文件。但是,使用隐藏的IFRAME可以实现相同的“效果”。而不是使用XMLHttpRequest,动态创建隐藏的iframe并使用适当的参数将其提交给servlet。当响应到来时,浏览器将根据内容类型/扩展名自动处理内容。如果您使用的是jQuery,那么this plugin将内置此功能。

答案 1 :(得分:0)

听起来像Rahulmohan知道他的东西但是可能值得尝试在你的响应流中添加一个文件名标题。我在asp.net中做了类似的事情,但没有在Ajax环境中做类似的事情,我的代码和你的代码之间的唯一区别是这一行:

Response.AddHeader(“Content-Disposition”,“attachment; filename =”& Filename&“。pdf”)

我的页面不能在Ajax环境中运行。