【发布时间】:2010-12-27 22:10:20
【问题描述】:
我正在尝试设置一个 servlet,以便 Android 手机/平板电脑(使用默认浏览器)上的用户可以填写表格并将一些参数发布到 servlet,然后 servlet 应用一些逻辑来选择一个预先现有的 epub 文件流回响应。看起来很简单,但它给了我各种各样的配合。
设置:Android 用户访问我的站点并提交表单,Weblogic 10.3 中的 servlet 选择我的一个测试 epub 文件作为响应流回,将 Content-Type 设置为 application/epub+zip,将 Content-Disposition 设置为attachment; filename=TestPartsManual.epub,将字节流回设备。
它在 Chrome 中运行良好,由于理论上的 WebKit 相同性和它很酷的开发工具,我正在那里进行所有主要开发。
但是当我在我的 Android 手机 (Tmobile Vibrant Galaxy S) 上使用默认浏览器 (User-Agent: Mozilla/5.0 (Linux; U; Android 2.1-update1; zh-cn; 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 映射,为 epub 扩展提供了一个 application/epub+zip 的 mime 类型。我点击链接,通过 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,即使是 quoted filenames...
最后,(我承认,这只是一个切线)我在连接到我的 Weblogic VM 的 Eclipse 中打开调试以拦截表单发布。也许我可以看到有什么东西穿过它。大约 5 秒左右后,手机浏览器变得不耐烦,重新提交表单! 另一个请求进入 servlet,并被另一个 weblogic 线程接收。这是什么鬼行为???让我很高兴我没有写股票交易应用程序......
【问题讨论】:
-
当你问他们这些问题时,Aldiko 给了你什么答案?当然,第二种情况源于 Aldiko 的代码。
-
Aldiko 没有回应,我同意第二种情况是 Aldiko 的“问题”。我敢打赌他们会说它不受支持,或者可能 Aldiko 2.0 处理得更好。 Aldiko 1.2.14 似乎只支持导入您之前在特定文件夹中的 sd 卡上的 epub 文件。但它似乎也注册了处理 epub mime 类型文件的意图,所以当你通过浏览器下载一个文件时,尝试在 Aldiko 中启动它会爆炸。