2012-07-27 89 views
0

我有一個servlet,我正在嘗試將文件寫入響應outputstream。在android中導致異常的https文件下載

response.setContentType("application/octet-stream"); 
String value = "attachment;filename=\"" + appName + "\""; 
response.setHeader("Content-Disposition", value); 
response.setContentLength((int) file.length()); 
response.setBufferSize(99999); 
while ((length = fis.read(buffer)) > 0) { 
    sumBytes = sumBytes + length; 
os.write(buffer, 0, length); 
} 
os.flush(); 
fis.close(); 

這對HTTP工作正常,但是當我嘗試通過https下載相同的文件時出現SocketException。

我認爲在請求後https連接正在關閉。

Plase爲此提供解決方案。

這是例外。

ClientAbortException: java.net.SocketException: Broken pipe 
     at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) 
     at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:439) 
     at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:354) 
     at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392) 
     at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381) 
     at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89) 
     at com.mfino.appselector.DownloadApp.writeFile(DownloadApp.java:139) 
     at com.mfino.appselector.DownloadApp.doGet(DownloadApp.java:101) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: java.net.SocketException: Broken pipe 
     at java.net.SocketOutputStream.socketWrite0(Native Method) 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
     at com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord.java:297) 
     at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java:286) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:743) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:731) 
     at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
     at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:760) 
     at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:359) 
     at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:784) 
     at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118) 
     at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:593) 
     at org.apache.coyote.Response.doWrite(Response.java:560) 
     at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:364) 
+0

在HTTPS服務器,是該證書由第三方一個簽署的有效或者是自簽名? – Kaediil 2012-07-27 17:33:11

+0

這是一個自簽名的 – LoyalBanana 2012-07-27 18:27:19

+0

您需要告訴套接字接受自簽名證書。 – Kaediil 2012-07-27 18:37:43

回答

2

請發佈logcat消息。 同時只是盲注,你有自簽證書。

查看herehere

+0

我發佈了異常。我認爲下載默認爲http,但沒有通過http打開套接字。 – LoyalBanana 2012-07-27 18:25:12

+0

我從來沒有這樣的例外。也許嘗試將緩衝區大小更改爲較小的值,比如說1024或檢查小文件是否發生錯誤。 – Leszek 2012-07-27 19:55:39

0

這可能是你下載的是UI線程裏面的數據,請做它在其他線程或的AsyncTask

+0

這裏沒有介入UI。我在tomcat中託管了一個android應用程序,當我確定請求來自android時,我正在從磁盤讀取文件並寫入流。 – LoyalBanana 2012-07-27 18:26:59