自定义代理复制PDF

时间:2013-02-22 17:08:58

标签: java java-ee pdf servlets

我正在为我们的主应用程序编写一个自定义代理作为Web服务客户端,该应用程序使用REST Web服务。出于安全原因,我试图在客户端使用servlet作为代理从服务器端检索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文件大小。

有谁知道问题是什么?

2 个答案:

答案 0 :(得分:1)

通过

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

你将始终写入缓冲区的全长,无论其有效内容长度如何,因为write只能查看缓冲区的大小来确定要写入的内容。

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

应该解决这个问题。

答案 1 :(得分:0)

我写完后关闭了outputStream,它工作正常。

我认为你不应该这样做?