Android 设备上的 JSF 流式下载返回 .htm 文件

2023-12-02

我目前在 Android 设备上的网页中遇到一个奇怪的问题。

我想做的是允许用户将 pdf 文件下载到他的移动设备上。因此,我提供了一个下载按钮,如所描述的设置中所示here.

只要我使用桌面浏览器 *Mozilla Firefox 10.**,一切都可以正常工作,但一旦我更改为移动设备(SGS II,Android 版本 2.3.5)下载的结果取决于我使用的浏览器应用程序。

Mozilla 和 Opera 移动设备:
两者似乎都能正确下载文件。

任何其他浏览器应用程序(内置、Dolphin HD...):
下载名为<filename>.pdf or <filename>.htm两者都代表一个.htm- 显示页面 html 源的文件。

我尝试过的:

  • 使用了StreamedContent方法出自PrimeFaces library

    public StreamedContent getFile() {
        // prepare file for download
        // reference webDAV directory and get file as stream
        this.file = new Helper().getWebDavFile(customerId, fileName);
    
        return file;
    }
    
  • 按照描述将文件手动流式传输到页面here。 (感谢 BalusC)

    public void download() throws IOException {
    
        byte[] is = new Helper().getWebDavFileManually(customerId, fileName);
    
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
    
        ec.responseReset(); 
        ec.setResponseContentType("application/pdf");  
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName.toUpperCase() + "\""); 
    
        OutputStream output = ec.getResponseOutputStream();
        output.write(is);
    
        fc.responseComplete(); 
    }  
    
  • Set an <a href="">到文件的本地副本。
    (我目前正在使用<p:commandButton>所以我必须使用执行重定向的方法而不是返回字符串,但它以两种方式工作)

    public void goToLink() throws IOException {
    
        // get WebDAV file and save temporarily
        byte[] b = new Helper().getWebDavFileManually(customerId, fileName);
        String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/") + fileName;
        File f = new File(path);
        try {
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(b);
            link = "http://someurl/somepage/" + fileName;
        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    
        // use link
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        ec.redirect(link);
    }
    

    即使在我的 Android 设备上,这最终方法也能正常工作,但我不要如果我可以避免走这条路,因为文件是从 WebDAV 流式传输的,我必须将每个文件保存到服务器。这会产生更多的 IO 负载并迫使我手动清理。

方法Helper().getWebDavFile and Helper().getWebDavFileManually要么返回一个默认流媒体内容由 PrimeFaces 或byte[]对于我自己的方法。

到目前为止我所知道的:

不幸的是,这不是我的问题的解决方案:)。
使用谷歌几个小时后,我发现有可能双 http 后请求。这将导致 Android 内部下载管理器(在文件下载损坏的情况下使用)发送额外的后请求,其中状态会丢失。

如中所述这个博客(参见部分获取、发布、休息 [更新 20120208])有人面临同样的问题。我已经尝试过该博客中提到的所有方法,但没有成功。
对此forum有人分析了相同的行为WireShark并得出了几乎相同的结论。
我没有找到更多资源,所以我陷入了困境。

我也在 PrimeFaces 上发过帖子forum只是为了确保不存在任何已知问题<p:fileDownload>成分。

我想知道的是:

我错过了什么吗?
是否有可能从 Android 设备上的 JSF(http-post 操作)网页下载流式文件?

任何帮助/建议/信息将不胜感激!
提前致谢!


好吧,在我遇到其他一些问题之后,我终于有时间来检查这个问题了。

在使用谷歌花了几个小时后,我没有得到任何新的线索,正如我的问题中已经提到的。

事实上,一些 Android 浏览器无法处理 POST 请求并返回适当的文件。

正因为如此,我选择给予servlet 方法(如评论中提到和描述的here)尝试构建我自己的 http-GET-request。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    ...
    // Initialize servlet response 
    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType(mime);
    response.setHeader("Content-Length", String.valueOf(data.length));
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    // write to response
    BufferedOutputStream output = null;
    try {
        output = new BufferedOutputStream(response.getOutputStream());
        output.write(data);
    }
    finally {
        output.close();
    }

瞧:下载适用于anyAndroid 设备无论使用哪种浏览器!

再次感谢@BalusC 为我指明了正确的方向。

如果我有时间,我也会尝试 JSF-GET 方法,但一开始我对此很满意。

如果有人面临同样的问题或能够提出另一个解决方案,我将不胜感激!

这对我有帮助,我会玩得很开心:D!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 设备上的 JSF 流式下载返回 .htm 文件 的相关文章

  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 您总是在发布后重定向吗?如果是,您如何管理?

    假设您正在提交一个表单 这会影响您的数据库 添加记录 删除记录 更新记录 您的请求如下所示 POST 应用程序 操作 更新 现在 假设您已完成更新 因此您希望将用户带到主页 Response sendRedirect application
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • Android Studio 导致 Windows 8.1 崩溃

    自从我将我的电脑更新到 Windows 8 1 后 当我启动 Android Studio 并运行一个我正在测试的简单应用程序时 我收到一个 其中包含 ritic struct error 强制我的核心 i7 重新启动 当我注意到我的磁盘在
  • 用于匹配 ISO 8601 日期时间字符串的正则表达式

    有人有一个好的正则表达式模式来匹配 iso 日期时间吗 即 2010 06 15T00 00 00 对于严格的 完整的日期时间 包括毫秒 每W3C 对规范的看法 Complete precision d 4 01 d 0 3 dT 0 2
  • React 中无用的构造函数是什么?

    我有两个文件 Description js and subjects js subject js 文件包含主题数组 export const Subjects id 1 title Mathematics text Cheat Sheet
  • Shell脚本多行注释

    我有一个很大的 shell 脚本文件 有时在进行修改时我想注释掉其中的一部分 但如下例所示的注释行给了我错误 Script bin bash lt
  • 从文本文件中读取特定行[重复]

    这个问题在这里已经有答案了 可能的重复 使用 PHP 在一个大文件中获取一行 我有一个大约 200 行的文件文本 我想从此文本文件中读取特定行 我该怎么做 谢谢 未经测试 function getline file linenum line
  • go 无法在模板执行的参数中使用输出(字符串类型)作为 io.Writer 类型

    在 go 中执行模板 在我的例子中为 tmpl html 很容易操作系统标准输出但如何将其写入字符串 输出 以便稍后我可以使用以下方式在邮件中发送 html gopkg in gomail v2 var output string t te
  • 如何使用访问令牌获取 Facebook 用户 ID

    我有一个 Facebook 桌面应用程序并且正在使用图形API 我能够获取访问令牌 但完成后 我不知道如何获取用户的 ID 我的流程是这样的 我将用户发送到https graph facebook com oauth authorize具有
  • 在 matplotlib 中绘制时间增量

    我正在阅读某年的时间 持续时间 数据 我想在 x 轴上绘制年份图表 在 y 轴上绘制时间 持续时间 图表 我希望 y 轴具有 HH MM SS 格式 我不知道该怎么做 这是我的代码 数据是合成的 真实数据集要大得多 import panda
  • 从 Bash 或 Python 获取 google Chrome IndexedDB 中的数据

    我的 Google Chrome 中有 LevelDB IndexedDB 文件 该文件位于此文件夹中 home
  • 在 TWIML 中等待应答时播放音乐

    如何在等待成功连接的同时拨打号码并向呼叫者播放音乐 下面的代码在执行之前等待音乐结束
  • 如何在 iphone sdk 中显示 .jpeg 或 .gif 或 .tiff 类型的图像

    我在 iPhone 中显示图像时遇到问题 我使用了下面的代码 但它仅适用于 png 文件 UIImageView imageView UIImageView alloc initWithFrame CGRectMake 6 10 80 80
  • 如何实现自定义Windows窗体设计器? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我们如何在 WinForms 应用程序中实现 Windows 窗体设计器 Visual Studio 使用 System ComponentModel Design 命名空间来实
  • Actionscript 3 中的相对 URL

    我有一个使用 Actionscript 3 的 Flash 影片 其中有一些可打开新页面链接的按钮 这是我用于重定向到新页面的代码 myButton addEventListener MouseEvent CLICK function e
  • Delphi 上限制 TCheckListBox 的选中项

    我想限制一个 TCheckListBox 我希望只检查 2 个项目 所有未检查的项目将被禁用并变灰 由于选中 未选中的项目是动态的 我不能使用静态 itemIndex 这是我尝试过的 但出现 超出芯片范围 错误 我的 CheckListBo
  • 使用 jQuery 加载页面后加载外部脚本

    我有点困惑如何做到这一点 基本上我有一个页面 其中通过 JavaScript 插入了 Facebook 分享按钮 问题是它阻止了该部分的页面加载 如何在页面加载后插入此标签并仍然执行脚本 我想以一种不引人注目的方式来做这件事 有什么想法吗
  • 如何在几秒钟后重定向 JSF

    我在 JSF Managed Bean 上有一个方法 我想要在用户调用方法之后 它执行一些业务逻辑 之后它将在某些业务逻辑完成后重定向大约 2 秒 当业务逻辑在 9 30 20 完成后 9 30 22 页面将重定向 我可以在 JSF Man
  • 提供所需应用程序包的有效路径。打印:条目,“:CFBundleIdentifier”,不存在

    react native cli 1 0 0 react native 0 39 2 我克隆了一个反应本机项目 然后我跑了npm install进而react native run ios 该项目因以下错误而失败 请注意该项目在 xcode
  • 使用 gmail api 发送并使用 zlib 压缩时 .zip 文件被损坏

    我正在使用 Python 3 7 并压缩 csv使用 python 的文件zipfile and zlib import zipfile filename report csv zip filename f filename 4 zip w
  • PHP MySQL 错误处理

    简单的问题 我希望 目前我正在使用以下代码 mysql query sql or header Location error 为了防止脚本的其余部分运行 我需要添加exit or die 有没有办法使用上面的内联方法来做到这一点 或者我需要
  • Android 设备上的 JSF 流式下载返回 .htm 文件

    我目前在 Android 设备上的网页中遇到一个奇怪的问题 我想做的是允许用户将 pdf 文件下载到他的移动设备上 因此 我提供了一个下载按钮 如所描述的设置中所示here 只要我使用桌面浏览器 Mozilla Firefox 10 一切都