我正在尝试设置一个 servlet,以便 Android 手机/平板电脑(使用默认浏览器)上的用户可以填写表格并将一些参数发布到 servlet,然后 servlet 应用一些逻辑来选择预先存在的 epub 文件流回响应。看起来很简单,但它给了我各种各样的配合。
设置:Android 用户访问我的站点并提交表单,Weblogic 10.3 中的 servlet 选择我的一个测试 epub 文件作为响应流回,设置 Content-Type application/epub+zip
,设置 Content-Disposition attachment; filename=TestPartsManual.epub
,将字节流回装置。
它在 Chrome 中工作得很好,由于理论上的 WebKit 相同性和它很酷的开发工具,我正在做所有的主要开发。
但是当我使用默认浏览器(用户代理:Mozilla/5.0(Linux;U;Android 2.1-update1;en-us;SGH-T959 Build/ECLAIR)AppleWebKit / 530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 ) 与 Aldiko 安装(和工作),它总是失败,响应中没有内容,Weblogic 报告套接字写入错误。所以我打开了 Wireshark,看到一些奇怪的事情发生了:
- 一旦表单发布到“/demoapp/partsmanual”,手机就会立即关闭连接。Weblogic 报告套接字写入错误。
- 浏览器屏幕翻转到下载列表并说它正在尝试下载“partsmanual.bin”
- 手机向 GET '/demoapp/partsmanual' 发送一个新请求,但没有任何表单参数,servlet 不知道要发回什么文件,也不会发回任何文件。
所以,任何想法为什么它突然不喜欢表单 POST 并单方面决定对同一个 URI 的无参数 GET 就足够了???
所以我简化了测试的事情,只提供了一个到 TestPartsManual.epub 的链接,并在 web.xml 中设置了一个 mime-mapping,为epub
扩展提供了一个 mime-type application/epub+zip
。我单击链接,通过 Wireshark 验证正在发送 Content-Type,一切正常:
- 浏览器屏幕翻转到下载列表,它说正在下载 TestPartsManual.epub。这很好。
- 下载完成,说它下载了 216k,Wireshark 同意,它一定喜欢 Content-Type,因为 Aldiko 图标在左边。这也很好。
- 但是当你点击它时,它会弹出一条通知,上面写着“你的书将被下载”。嗯?我的书已经下载了,对吧?
- 然后状态栏中的下载状态立即报告下载失败。它从未向服务器发送另一个 GET。
所以,知道为什么它会忽略已经下载的内容,然后在没有重试的情况下报告下载失败??? epub 文件本身,顺便说一句,已经过验证,复制到我的 sd 卡,导入到 Aldiko,它读取它很好,所以我不怀疑文件本身。
**更新** 我相信我通过单击 epub 链接看到的问题可以归结为您安装的任何挑剔的 Android epub 阅读器。例如,尽管 Google Books 1.0.16 显示 epub,但它不希望与您下载的任何内容(除了通过他们的服务)有任何关系。Aldiko 1.2.14 将其意图句柄注册为 epub mime 类型,但随后会在浏览器下载启动的任何内容上崩溃。FBReaderJ 似乎已经注册了处理以 .epub 结尾的链接的意图,它确实处理下载并显示它们(耶 FBReaderJ!),但我还不能确定它是否会仅通过 mime 类型处理表单 POST(我最初的要求),因为我越来越相信我上面的第一个问题是浏览器问题。我在看着你,Content-Disposition,即使是引用的文件名...
最后,(我承认,这只是一个切线)我在连接到我的 Weblogic VM 的 Eclipse 中打开调试以拦截表单发布。也许我可以看到有什么东西穿过它。大约5秒左右后,手机浏览器好像不耐烦了,重新提交表单! 另一个请求进入 servlet,并被另一个 weblogic 线程接收。这是什么鬼行为???让我很高兴我没有写股票交易应用程序......