自定义代理复制PDF



我正在为我们的主应用程序编写一个自定义代理作为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时,文件是好的,所以它必须是切换中的某个东西。字节计数等于PDF文件大小。

有人知道问题出在哪里吗?

通过进行

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

您将始终写入缓冲区的完整长度,而不管其有效内容长度如何,因为写入只能查看缓冲区的大小来确定要写入的内容。

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

应该解决那个问题。

我在写入outputStream后关闭了它,它运行良好。

我不认为你应该这么做?

最新更新