2016-10-20 12 views
1

PDFドキュメントを生成して返すJavaサーブレット(3.x - Tomcat 8)がいくつかあります。私は決してそれらのどれにも問題がなかった。これはされている、Javaサーブレットがレスポンスバイトを書き込まない

response.reset(); 
response.setContentType("application/pdf"); 
response.setHeader("Content-Transfer-Encoding", "binary"); 
response.setHeader("Content-Disposition","attachment; filename=\""+filename+".pdf\""); 
response.setContentLength(pdfBytes.length); 

System.out.println("# Bytes => " + pdfBytes.length); 

ServletOutputStream sos = response.getOutputStream(); 
BufferedOutputStream bos = new BufferedOutputStream(sos); 
bos.write(pdfBytes); 
sos.flush(); 
sos.close(); 

私が言ったように:私は最近、また、PDFドキュメントを作成して返すために新しいサーブレットを書いて、他の人が使用しているとして、この新しいサーブレットは、応答コードのまったく同じ片を用いています他のものとうまく動作しますが、新しいサーブレットを呼び出すと、上記のprint文に0以外の値があっても0バイトが返されます。しかし

、私は上記の回答の書き込みコードを変更した場合:それはよく形成されたPDFドキュメントを返し、正常に動作します...

OutputStream os = response.getOutputStream(); 
os.write(pdfBytes); 
os.flush(); 
os.close(); 

。なぜこれが起こっているのでしょうか?

+1

べきではない 'sos.flush();' 'ことbos.flush( );など? – Thomas

答えて

3

あなたはBufferedOutputStreamをフラッシュしていないので、すべてのデータをバッファリングしています。 ではなく、にフラッシュする必要があります。

しかし、1バイト配列しか書いていない場合は、とにかくBufferedOutputStreamを使用しても意味がありません。とにかく明示的にフラッシュする必要はありません。だから、あなただけの必要があります。

ServletOutputStream sos = response.getOutputStream(); 
sos.write(pdfBytes); 
// Unclear whether *this* is needed, either. 
sos.close(); 

を私は個人的に出力ストリームを閉じますサーブレットコンテナを期待したいが、それはドキュメントから明らかではありません。あなたは例外が発生した場合、それを閉じたいかどうかは別の問題です...

+0

それは働いた!しかし、私は理解していません。同じコードを使用している他のサーブレットが正しく動作するのはなぜですか? – RTF

+0

@RTF:彼らは本当にそうではないと思う。または、書き込まれているデータがバッファーサイズよりも大きいため、それらは機能しているだけです。あなたが持っているコードは確かに壊れています。 –

+0

ブログの投稿からコピーして貼り付けて、それが正しいと仮定して私に奉仕します。私はそのリプライコードの定型関数を作成しなかったので、私は少しリファクタリングをしているようです。 – RTF

1

あなたべき本当にフラッシュおよびクローズbosないsos

関連する問題