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正在进行中”。然后最终失败了。几点......
更新#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)
答案 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个问题
您使用的浏览器不信任自签名证书。
响应永远不会刷新到客户端。试试这个: