来自控制器,android浏览器的流式传输字节,下载失败

时间:2011-11-09 04:36:00

标签: android grails download

Grails 1.3.7

我有一些看起来像这样的代码......

response.setHeader("Content-disposition", "attachment; filename=${fileName}")
response.contentType = download.contentType
response.contentLength = file.length()
response.outputStream << file.getBytes()

在桌面和iPad上,下载工作正常。但在Android设备上,它只是给了我“未知的myserver.com正在进行中”。然后最终失败了。几点......

  • 这在本地,登台和生产服务器上发生
  • 在没有SSL的情况下进行测试,一切正常。
  • 当我在Dolphin浏览器中尝试下载时,我得到了相同的结果 添加一些文字“等待数据连接”

更新#2:Stacktrace只有在从Android设备下载时才会出现

Stacktrace follows:
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 com.wbr.consumer.ProductController$_closure1_closure2.doCall(ProductController.groovy:30)
    at com.wbr.consumer.ProductController$_closure1.doCall(ProductController.groovy:28)
    at com.wbr.consumer.ProductController$_closure1.doCall(ProductController.groovy)
    at java.lang.Thread.run(Thread.java:680)

2 个答案:

答案 0 :(得分:2)

我意识到这已经晚了几个月,但我也遇到了Android浏览器和我正在处理的Grails应用程序这个问题。

问题似乎是Android如何处理可下载内容以及android浏览器与下载管理器的集成。

http://code.google.com/p/android/issues/detail?id=1978

http://code.google.com/p/android/issues/detail?id=18462

我在服务器端收到两个可下载文件的请求;一个来自浏览器,一个来自下载管理器。一旦浏览器确定它是可下载的内容,浏览器中的那个就会终止并且套接字关闭。然后浏览器将下载交给下载管理器。

我也遇到了从下载管理器下载失败的问题,但是我必须尽快发送标题。我遇到了这个只有更大的APK,小的APK(10-20K以下)似乎下载得很好。

有些代码可能有所帮助:

    response.contentType = 'application/vnd.android.package-archive'
    response.addHeader('Content-Disposition', 'attachment; filename=FILENAME.APK')

    // output file content
    response.setStatus(200)
    response.setContentLength("CONTENTSIZE")

    // send headers
    response.flushBuffer()

    try {
        response.outputStream << {FILE}.getBytes()
        response.outputStream.flush()
    } catch (SocketException e) {
        log.error(e)
    }
    return

有了这个,我总是会遇到一个套接字异常。不知道这是否可以避免,从一些快速搜索我没有看到从servlet确定套接字状态的方法,而不是简单地尝试写入套接字。

答案 1 :(得分:0)

听起来有可能存在2个问题

  1. 您使用的浏览器不信任自签名证书。

    • 其他SSL网站是否可以在此浏览器中使用?
    • 您可以安装STG吗? cert进入浏览器的可信证书商店?
    • 一个愚蠢的问题是:你的请求URL是否正确? https vs http ...我知道这很愚蠢......
  2. 响应永远不会刷新到客户端。试试这个:

    • response.outputStream.flush()