【问题标题】:epub download failure on Android/WebKit browser, and general browser weirdnessAndroid/WebKit 浏览器上的 epub 下载失败,以及一般浏览器异常
【发布时间】: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,看到了一些奇怪的事情:

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

所以,知道为什么它突然不喜欢表单 POST 并单方面决定对同一个 URI 进行无参数 GET 就足够了???

所以我简化了测试的工作,只提供了一个指向 TestPartsManual.epub 的链接,并在 web.xml 中设置了一个 mime 映射,为 epub 扩展提供了一个 application/epub+zip 的 mime 类型。我点击链接,通过 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,即使是 quoted filenames...

最后,(我承认,这只是一个切线)我在连接到我的 Weblogic VM 的 Eclipse 中打开调试以拦截表单发布。也许我可以看到有什么东西穿过它。大约 5 秒左右后,手机浏览器变得不耐烦,重新提交表单! 另一个请求进入 servlet,并被另一个 weblogic 线程接收。这是什么鬼行为???让我很高兴我没有写股票交易应用程序......

【问题讨论】:

  • 当你问他们这些问题时,Aldiko 给了你什么答案?当然,第二种情况源于 Aldiko 的代码。
  • Aldiko 没有回应,我同意第二种情况是 Aldiko 的“问题”。我敢打赌他们会说它不受支持,或者可能 Aldiko 2.0 处理得更好。 Aldiko 1.2.14 似乎只支持导入您之前在特定文件夹中的 sd 卡上的 epub 文件。但它似乎也注册了处理 epub mime 类型文件的意图,所以当你通过浏览器下载一个文件时,尝试在 Aldiko 中启动它会爆炸。

标签: android webkit epub


【解决方案1】:

你目前不能这样做。如前所述,在 Android 浏览器中,当您发布一个响应下载附件文件的表单时,服务器的响应会停止,下载管理器会启动,它会错误地尝试 GET 到相同的 URI 但没有表单参数。令人费解的是,这种双重请求是“设计使然”,并且对表单 POST 的支持是一种增强,但“不要屏住呼吸”。请参阅http://code.google.com/p/android/issues/detail?id=1780 和 3949。

在它修复之前,我猜你只需要使用已注册以处理 .epub 文件扩展名的阅读器获取 .epub 文件。

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 2016-04-14
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多