- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前在 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().getWebDavFile
和 Helper().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/
我想了解为什么一些 Jakarta EE 规范是空的。 例如 Jakarta Annotations规范由免责声明和快速描述(3 行)组成,但是有 Javadoc . 当 JCP 负责 J2EE 规范
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在采用 Jakarta EE 9 并使用 EJB 和 WEB 模块开发一个 EE 应用程序。 EJB 已经完成并部署在 Glassfish 6(Jakarta EE 9 的 RI 实现)上。现在,
OpenLiberty(v20.0.0.2-beta 或其他版本)中是否有办法将 jakarta ee 9(通过 webProfile-9.0 或 jakartaee-9.0 或任何仅 jakarta
在使用Spring Boot 3.0.7并试图保持更新时,我遇到了这个错误,不知道它是什么意思。。加载的依赖项是Spring Security 6.0.9,问题存在于使用Java 17或19的情况下(
有没有办法在 JPA 实体监听器中检查当前事务是否已提交,如下所示? @ApplicationScoped public class EntityListener { @Inject
以下代码使用 javamail api 通过 gmail smtp 服务器发送邮件和附件。 public void doSendGmail(){ from = txtFrom.getT
大家好我有一个应用程序(spring+hibernate)需要同时发送数千封电子邮件我被告知这里最好的解决方案是有一个邮件服务器我不知道从哪里开始,或者是否有更好的框架或服务所以请大家给我一些信息,从
我正在尝试从 Java 邮件的文件夹中删除/删除消息(在我将其复制到另一个文件夹之后),这是我的代码: Flags deleted = new Flags("DELETED"); folder.se
某些页面可以接收称为“P1”的特定请求参数: page.do?P1=value1 现在,一个scriptlet正在测试request参数的存在,如果P1为“value1”,则会在页面上呈现一些信息。
我有一段非常类似于此http://java.sun.com/developer/onlineTraining/JavaMail/contents.html#JavaMailFetching的代码 我的
我在NetBeans中创建了一个Java Web应用程序项目,并在其中创建了一个启动bean: package malibu.util; import javax.annotation.PostCon
我有两个不同的项目:A 和 B。 B 包含一个拦截器,我想在项目 A 以及将来的项目 C 和 D 中使用它。 我在两个项目中都使用 jboss-javaee-6.0 版本 3.0.3.Final(这意
我一直在阅读 “Java 事务” ,我一直困惑它是什么?什么是有用的? 最佳答案 你可以谷歌搜索并找到这样的页面:http://www.java-tips.org/java-ee-tips/enter
这个问题在这里已经有了答案: What exactly is Java EE? (5 个回答) Difference between an application server and a servl
Web 应用程序的用户界面通常包含用于执行 CRUD 操作的各种按钮。在执行以下操作时,按钮标签的建议命名约定是什么? 用户创建(添加用户...或添加用户或添加用户) 事件创建(添加事件...或添加事
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对java网页环境很陌生。最近尝试用Java开发一个电子商务平台。 因此,我使用 j_security_check 基于表单作为我的身份验证工具。身份验证完成后,成功重定向到所需页面。 但是,由于我
什么时候 我通过无状态服务从数据库中获取实体, 然后在另一个 bean 和 中修改它 然后想通过无状态服务将其保存到数据库中, 我注意到实体已分离。我认为因为无状态服务的持久化上下文,实体从被夺取到存
我是一名优秀的程序员,十分优秀!