2

我正在运行一个提供 servlet 的 Web 应用程序。此 servlet 从网络文件系统打开一个 pdf 文件,最后将其流式传输到请求浏览器。

所有的 pdf 文件都由 adobe 生命周期 pdf 生成器线性化,并准备好快速浏览网页。

不幸的是,快速网络视图不起作用。我想这是如何在java代码中打开和流式传输文件以及响应头信息的设置的问题。如果我在我的 webapp 中将测试 pdf 部署到 jboss AS 并通过 url 直接从浏览器打开它,则增量加载工作。

谁能帮我?

这是我的servlet的代码:

response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
    "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-Disposition",
    "inline;filename=" + documentReference);
response.setHeader("Accept-Ranges", "bytes");

File nfsPDF = new File(NFS_DIRECTORY_PATH + documentReference);

FileInputStream fis = new FileInputStream(nfsPDF);
BufferedInputStream bis = new BufferedInputStream(fis);
ServletOutputStream sos = response.getOutputStream();
byte[] buffer = new byte[(int) nfsPDF.length()];
while (true) {
   int bytesRead = bis.read(buffer, 0, buffer.length);
   if (bytesRead < 0) {
      break;
   }
   sos.write(buffer, 0, bytesRead);
}
sos.flush();
//... closing...
4

2 回答 2

1

让我们来看看。您想分部分发送文件,对吗?然后您应该检查 Range 标头(HTTP 标头)并仅发送此范围内的字节。我说的对吗?

于 2010-09-16T18:03:44.367 回答
0

我不熟悉“PDF 快速网络视图”功能,但在您编写代码时,您首先将文件完全读入缓冲区,然后将其写出。在调用 sos.flush() 之前,客户端不会收到任何东西。事实上,你的 while 循环已经过时了,因为总会有一次运行。

也许您应该尝试按块读取/写入内容。

byte[] buffer = new byte[1024];
while (true) {
   int bytesRead = bis.read(buffer, 0, buffer.length);
   if (bytesRead < 0) {
      break;
   }
   sos.write(buffer, 0, bytesRead);
   sos.flush();
}

sos.flush();
于 2010-09-16T13:50:53.447 回答