0

我正在尝试设置一个 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,看到一些奇怪的事情发生了:

  1. 一旦表单发布到“/demoapp/partsmanual”,手机就会立即关闭连接。Weblogic 报告套接字写入错误。
  2. 浏览器屏幕翻转到下载列表并说它正在尝试下载“partsmanual.bin”
  3. 手机向 GET '/demoapp/partsmanual' 发送一个新请求,但没有任何表单参数,servlet 不知道要发回什么文件,也不会发回任何文件。

所以,任何想法为什么它突然不喜欢表单 POST 并单方面决定对同一个 URI 的无参数 GET 就足够了???

所以我简化了测试的事情,只提供了一个到 TestPartsManual.epub 的链接,并在 web.xml 中设置了一个 mime-mapping,为epub扩展提供了一个 mime-type application/epub+zip。我单击链接,通过 Wireshark 验证正在发送 Content-Type,一切正常

  1. 浏览器屏幕翻转到下载列表,它说正在下载 TestPartsManual.epub。这很好。
  2. 下载完成,说它下载了 216k,Wireshark 同意,它一定喜欢 Content-Type,因为 Aldiko 图标在左边。这也很好。
  3. 但是当你点击它时,它会弹出一条通知,上面写着“你的书将被下载”。嗯?我的书已经下载了,对吧?
  4. 然后状态栏中的下载状态立即报告下载失败。它从未向服务器发送另一个 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 线程接收。这是什么鬼行为???让我很高兴我没有写股票交易应用程序......

4

1 回答 1

0

You can't presently do it. As described, in the Android browser, when you POST a form that responds with an attachment file download, the server's response is stopped, the download manager is launched, and it incorrectly tries a GET to the same URI but without the form parameters. Inexplicably this double request is 'by design' and support for form POSTs is an enhancement, but "don't hold your breath". See http://code.google.com/p/android/issues/detail?id=1780 and 3949.

Until it's fixed, I guess you just have to GET .epub files with a reader who's registered to handle the .epub file extension.

于 2010-12-30T22:57:19.080 回答