首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

手机 从 Servlet 下载文件 有关问题!

2012-01-31 
手机 从 Servlet 下载文件 问题!!急IE从该servlet就能下载,但是手机WIFI从这里下载就不行,下载文件是.apk

手机 从 Servlet 下载文件 问题!!急
IE从该servlet就能下载,但是手机WIFI从这里下载就不行,下载文件是.apk文件(安卓的应用),如何解决呢?谢谢

具体代码如下:

Java code
@Override    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException    {        try        {            // path是指欲下载的文件的路径。            String path = "D:\\apps\\Resource\\bin\\android\\android.apk";            File file = new File(path);            // 取得文件名。            String filename = file.getName();            // 取得文件的后缀名。            // String ext = filename.substring(filename.lastIndexOf(".") +            // 1).toUpperCase();            // 以流的形式下载文件。            InputStream fis = new BufferedInputStream(new FileInputStream(file));            byte[] buffer = new byte[fis.available()];            fis.read(buffer);            fis.close();            // 清空response//            response.reset();            // 设置response的Header            response.addHeader("Content-Disposition", "attachment;filename="                    + new String(filename.getBytes("utf-8"), "utf-8"));            response.addHeader("Content-Length", "" + file.length());            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());            response.setContentType("application/octet-stream");            toClient.write(buffer);  //这句手机访问的话就报错,错误在下面            toClient.flush();            toClient.close();        }        catch(IOException ex)        {            ex.printStackTrace();        }    }


报错:

Java code
ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:354)    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)    at java.io.FilterOutputStream.write(FilterOutputStream.java:80)    at com.entel.servlet.Servlet.doGet(Servlet.java:60)    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:298)    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)    at java.lang.Thread.run(Thread.java:619)Caused by: java.net.SocketException: Software caused connection abort: socket write error    at java.net.SocketOutputStream.socketWrite0(Native Method)    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:741)    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:765)    at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118)    at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:574)    at org.apache.coyote.Response.doWrite(Response.java:560)    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)    ... 21 more 



[解决办法]
IP?手机的ip和电脑的ip联起来了吗
[解决办法]
socket write error是不是连接错误啊?
[解决办法]
一次性写入数据量过大???
[解决办法]
5楼有理,可能是写入的数据量超过浏览器的缓存?
[解决办法]
探讨

引用:
一次性写入数据量过大???


863k的一个.apk文件 不可能过大 手机用的安装程序

[解决办法]
对了!你的是android项目吧?有没有文件的读写权限?
[解决办法]
能想到的就这些了,我估计是文件相关写权限没有加,看哪个错误是能够读取,写的时候出现错误
[解决办法]
客户端连接断开了。
[解决办法]
谷歌了一下,好像跟一次性输出数据量有关系,弄个循环写看看。

手机一次性能接受的数据和处理速度肯定没法跟电脑比的
[解决办法]
楼主把工程贴出来,我是搞android的,不知道能不能帮上你
[解决办法]
如果是apk文件的话,在电脑下载是没问题的,但是手机浏览器下载的时候貌似是多线程去访问的

另外 最最最最最重要的一点 你需要加下面这行东西,不然手机下载了后不能安装
response.setContentType("application/vnd.android.package-archive");
[解决办法]
附上代码片段
Java code
String filedownload = "xxxxxx";//文件pathresponse.addHeader("Content-Disposition", "attachment;filename="        + filedisplay);java.io.OutputStream outp = null;java.io.FileInputStream in = null;try {    outp = response.getOutputStream();    in = new java.io.FileInputStream(filedownload);    byte[] b = new byte[102400];    int i = 0;    while ((i = in.read(b)) > 0) {        outp.write(b, 0, i);    }    outp.flush();} catch (Exception e) {} finally {    if (in != null) {        in.close();        in = null;    }    if (outp != null) {        outp.close();        outp = null;    }} out.clear();out = pageContext.pushBody(); 

热点排行