gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:28:16 25 4
gpt4 key购买 nike

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

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

只要我使用我的桌面浏览器 *Mozilla Firefox 10.** 一切正常,但一旦我切换到我的移动设备(SGS II,Android vers. 2.3.5)下载结果取决于我使用的浏览器应用程序。

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

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

我尝试过的:

  • 使用了 StreamedContent PrimeFaces 库中的方法

    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();
    }
  • 设置 <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 设备上,这种 final方法也能正常工作,但我不想走这条路,如果我能避免的话,因为文件是从 WebDAV 流式传输的,我必须保存每个文件到服务器。这会产生更多的 IO 负载并迫使我手动清理。

方法 Helper().getWebDavFileHelper().getWebDavFileManually要么返回 PrimeFaces 使用的 DefaultStreamedConten,要么返回用于我自己的方法的 byte[]

目前我所知道的:

不幸的是,这不是我的问题的解决方案:)。
在使用 google 数小时后,我发现存在 double-http-post-request 的可能性。这将导致 android 内部下载管理器(在文件下载损坏的情况下使用)发送一个额外的后请求,其中状态丢失。

this blog 中所述(参见 GET、POST、REST [UPDATE 20120208] 部分)有人面临同样的问题。我已经尝试了此博客中提到的所有方法,但没有成功。
关于这个forum有人用 WireShark 分析了相同的行为并得出了几乎相同的结论。
我没有找到更多的资源,所以我一直停留在这个位置。

我还在 PrimeFaces 上发帖 forum只是为了确保没有关于 <p:fileDownload> 的任何已知问题组件。

我想知道的:

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

如有任何帮助/建议/信息,我们将不胜感激!
提前致谢!

最佳答案

好的,在遇到其他一些问题后,我终于有时间重新审视这个问题。

在使用谷歌花了更多时间后,我没有得到任何新的线索,正如我的问题中已经提到的那样。

这仍然是一些 android 浏览器无法处理 POST 请求并返回适当文件的事实。

因此,我选择尝试使用 servlet-approach(如评论中所述和描述的 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();
}

:无论使用哪种浏览器,下载都适用于任何安卓设备!

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

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

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

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

关于jakarta-ee - Android 设备上的 JSF 流式下载返回 .htm 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9667362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com