【问题标题】:https file download in android causing exceptionandroid中的https文件下载导致异常
【发布时间】:2012-07-27 17:22:03
【问题描述】:

我有一个 servlet,我试图将文件写入响应输出流。

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 连接在请求后立即关闭。

请为此提供解决方案。

这是一个例外。

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)

【问题讨论】:

  • 在 https 服务器中,证书是由第三方签名的有效证书还是自签名证书?
  • 您需要告诉套接字接受该自签名证书。

标签: android https


【解决方案1】:

请发布 logcat 消息。 同时只是盲目的拍摄,你有自签名证书。

herehere

【讨论】:

  • 我已经发布了异常。我认为下载默认为http,但没有通过http打开套接字。
  • 我从来没有遇到过这样的异常。也许尝试将缓冲区大小更改为较小的值,比如 1024 或检查较小的文件是否发生该错误。
【解决方案2】:

可能是你在UI线程里面下载数据,请在其他线程或者AsyncTask里面下载

【讨论】:

  • 这里不涉及 UI。我在 tomcat 中托管一个 android 应用程序,当我确定请求来自 android 时,我正在从磁盘读取文件并写入流。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2012-08-24
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多