2013-02-22 50 views
0

我正在爲使用REST Web服務的主應用程序編寫定製代理作爲Web服務客戶端。出於安全原因,我試圖在客戶端使用一個servlet作爲代理來從服務器端檢索PDF,然後通過客戶端應用程序在應用程序Web瀏覽器中顯示它。自定義代理複製PDF

本作的心臟,我有這樣的一段代碼:

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文件的大小。

有沒有人有一個想法是什麼問題?

回答

0

我寫完之後關閉了outputStream並且工作正常。

我不認爲你應該那樣做?

+0

outputStream.flush()應該足夠了 – fvu 2013-02-22 17:34:16

+0

outputStream是一個BufferedOutputStream,所以您顯然需要最終刷新緩衝區,無論是顯式還是隱式關閉。 – mkl 2013-02-22 18:57:08

1

這樣做

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

,你將永遠寫緩衝區的全長,不管其有效含量長度寫的只能看緩衝區的大小來確定寫什麼。

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

應該照顧這個問題。

+0

有人指出同樣的事情給我。我修改了代碼,但仍然存在相同的問題。 – Thom 2013-02-22 17:26:35