0

私は、RESTWebサービスを使用するメインアプリケーションのWebサービスクライアントとしてカスタムプロキシを作成しています。セキュリティ上の理由から、クライアント側のサーブレットをプロキシとして使用して、サーバー側からPDFを取得し、クライアントアプリを介してアプリケーションのWebブラウザーに表示しようとしています。

この中心として、私はこのコードを持っています:

  protected void copy(HttpResponse fromResponse, HttpServletResponse toResponse)
      throws IOException{
    HttpEntity entity = fromResponse.getEntity();
    for(Header header:fromResponse.getAllHeaders()){
      toResponse.setHeader(header.getName(), header.getValue());
    }

    BufferedInputStream inputStream = new BufferedInputStream(entity.getContent());
    BufferedOutputStream outputStream = new BufferedOutputStream(toResponse.getOutputStream());

int oneByte;
int byteCount = 0;
while((oneByte = inputStream.read()) >= 0){
  outputStream.write(oneByte);
  ++byteCount;
}

log.debug("Bytes copied:" + byteCount);

返された出力ストリームから現在の出力ストリームにPDFをコピーしてから、それを返す必要があります。

ただし、実行すると、Adobe Readerから、ファイルが破損していて修復できなかったというエラーが表示されます。URLを直接実行すると、ファイルは問題ないので、ハンドオフに含まれている必要があります。byteCountは、PDFファイルのサイズと同じです。

誰かが問題が何であるかについての考えを持っていますか?

4

2 に答える 2

1

することによって

while((inputStream.read(buffer)) >= 0){
  outputStream.write(buffer);
}

書き込みはバッファのサイズを調べて何を書き込むかを決定することしかできないため、有効なコンテンツの長さに関係なく、常にバッファの全長を書き込むことになります。

int count;
while(((count = inputStream.read(buffer))) >= 0){
  outputStream.write(buffer,0,count);
}

その問題の世話をする必要があります。

于 2013-02-22T17:15:21.363 に答える
0

書き込み後にoutputStreamを閉じましたが、正常に動作します。

私はあなたがそうすることになっていたとは思いませんでしたか?

于 2013-02-22T17:31:16.707 に答える