2

サーブレットを提供する Web アプリを実行しています。このサーブレットは、ネットワーク ファイル システムから PDF ファイルを開き、最終的に要求元のブラウザーにストリーミングします。

すべての pdf ファイルは、adobe ライフサイクル pdf ジェネレーターによって線形化され、高速な Web 表示の準備が整います。

残念ながら、高速 Web ビューは機能しません。Javaコードでファイルを開いてストリーミングする方法と、応答ヘッダー情報の設定の問題だと思います。webapp 内のテスト pdf を jboss AS にデプロイし、ブラウザーから URL で直接開くと、インクリメンタル ロードが機能します。

誰でも私を助けることができますか?

私のサーブレットのコードは次のとおりです。

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

どれどれ。ファイルを分割して送信しますよね?次に、範囲ヘッダー (HTTP ヘッダー) を確認し、この範囲内のバイトのみを送信する必要があります。私は正しいですか?

于 2010-09-16T18:03:44.367 に答える
0

「PDF高速Webビュー」機能には慣れていませんが、コードでは、最初にファイルを完全にバッファに読み込んでから書き出します。sos.flush() への呼び出しの前に、クライアントは何も受け取りません。実際、while ループは、常に 1 回しか実行されないため、時代遅れです。

たぶん、ブロックごとに読み書きするようにしてください。

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 に答える