我正在尝试设置一个servlet,以便Android手机/平板电脑上的用户(使用默认浏览器)可以填写表单并将一些参数发布到servlet,然后servlet应用一些逻辑来选择一个pre-pre现有的epub文件回流回来。看起来很简单,但它给了我各种各样的合适。
设置:Android用户访问我的网站并提交表单,Weblogic 10.3中的servlet选择我的一个测试epub文件回流回来,设置内容类型application/epub+zip
,设置内容 - 处理attachment; filename=TestPartsManual.epub
,将字节流回设备。
它在Chrome中运行得很好,我正在进行所有主要开发,因为它具有理论上的WebKit相同性及其酷炫的开发工具。
但是当我使用默认浏览器在我的Android手机( Tmobile Vibrant Galaxy S )上尝试时( User-Agent:Mozilla / 5.0(Linux; U; Android 2.1-update1; en-us; SGH-T959 Build / ECLAIR)AppleWebKit / 530.17(KHTML,如Gecko)版本/ 4.0 Mobile Safari / 530.17 )安装了Aldiko(并且正常工作),它总是失败,响应中没有内容, Weblogic报告套接字写入错误。所以我打开了Wireshark,发现了一些奇怪的事情:
所以,任何想法为什么它突然不喜欢POST形式并且单方面决定对同一个URI的无参数GET应该足够了
因此,我简化测试的内容,只提供TestPartsManual.epub的链接,并在web.xml中设置mime-mapping,为epub
扩展名提供mime-type application/epub+zip
。我单击链接,通过Wireshark验证Content-Type是否正在发送,并且正在查找确定:
所以,任何想法为什么它忽略了已经下载的内容,然后报告下载失败而没有重试??? epub文件本身,顺便说一句,已经过验证,复制到我的SD卡,导入Aldiko,它读得很好,所以我不怀疑文件本身。
**更新**我相信只需单击一个epub链接即可看到的问题可以归结为您安装的任何挑剔的Android epub阅读器。例如,虽然Google Books 1.0.16显示了epub,但它除了通过他们的服务之外,与你下载的任何东西都没有任何关系。 Aldiko 1.2.14注册其意图处理epub mime-type,但随后爆炸从浏览器下载启动的任何东西。 FBReaderJ似乎已经注册了处理以.epub结尾的链接的意图,它确实处理下载并显示它们(yay FBReaderJ!),但是我还不知道它是否仅仅通过mime-type处理表单POST(我原来的要求),因为我越来越相信我上面的第一个问题是浏览器问题。我正在看着你,Content-Disposition,即使是quoted filenames ......
最后,(我承认,这只是一个切线)我打开Eclipse中的调试连接到我的Weblogic VM来拦截表单帖子。也许我可以看到一些踩过它的东西。大约5秒左右后,就像手机浏览器不耐烦一样,重新提交表单!另一个请求进入servlet,它被另一个weblogic线程接收。什么样的行为是???让我很高兴我不是在写一个股票交易应用....
答案 0 :(得分:0)
你现在不能这样做。如上所述,在Android浏览器中,当您发布一个响应附件文件下载的表单时,服务器的响应将停止,下载管理器将启动,并且它错误地尝试将GET转换为相同的URI但没有表单参数。令人费解的是,这个双重请求是“按设计”,对表单POST的支持是一种增强,但“不要屏住呼吸”。请参阅http://code.google.com/p/android/issues/detail?id=1780和3949。
在修复之前,我想您只需要使用已注册处理.epub文件扩展名的读者获取.epub文件。