java - 处理同一页面上没有请求的丢失文件下载链接

标签 java jsf jakarta-ee jsf-2

当相应文件丢失时,处理文件下载链接点击的最佳做法是什么?

具体情况是DB中存在附件实体,仅指向文件名,文件存储路径可以单独/单独配置。这是针对旧版应用程序的,必须得到支持。

这可能吗?这样的代码是什么样的?我试过了

    if ( file.canRead() )
    {
        byte[] data = FileUtils.readFileToByteArray( file );

        // goes to code like here: http://balusc.blogspot.de/2006/05/pdf-handling.html
        downloadFile( attachment.getFileName(), data );
    }
    else
    {
        this.log.errorv( "Attachment {0} not found in configured storage path {1}", file, this.storagePath );

        FacesContext facesContext = FacesContext.getCurrentInstance();

        facesContext.addMessage( null,
                                 new FacesMessage( FacesMessage.SEVERITY_ERROR, "Failed.",
                                                   "Downlosding file " + file + " failed! File doesn't exist in the configured storage path " + this.storagePath ) );

        // ???
        facesContext.responseComplete();
    }

但这会导致

XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: https://localhost:8181/cmc-compliance/view/prototype/collisionManager.xhtml
Zeile Nr. 1, Spalte 1:

( <rant>天哪,我讨厌...呃不喜欢 int18ned错误消息...有人应该摆脱这个人谁认为这是个好主意... </rant> )

好的,上面的意思类似于“XML 处理错误:找不到元素 + 第 1 行,第 1 列”

我的代码显然不是正确的方法......

我在数据表中使用 JSF 代码:

<h:commandLink action="#{attachmentManager.downloadAttachment(att)}">
    <h:graphicImage library="images/icons" name="page_white.png" />
    <h:outputText value="#{att.fileName}" />
</h:commandLink>

我理想的情况是显示一条 JSF 消息(或 PrimeFaces 咆哮),然后让页面保持原样,即不再在同一页面上发出完整请求。

你是如何做到这一点的?

最佳答案

facesContext.responseComplete();您基本上是在阻止 JSF 呈现响应。因此,客户端检索到完全空的响应。网络浏览器正在努力充分利用它。网络浏览器只知道所请求的资源有 .xhtml文件扩展名。因此网络浏览器假定它是一些 XML 内容。然后,Web 浏览器尝试将空响应解析为 XML。但它因给定的错误而惨败,因为根本没有 XML 元素。即,格式良好的 XML 文档需要至少具有一个根 XML 元素。

删除facesContext.responseComplete();行并以通常的方式从方法返回。您应该使用facesContext.responseComplete();当您已经自己写入响应时,例如在这种特殊情况下提供文件下载。


OMG, I HATE int18ned error messages... someone should get rid of the person who thought this is a good idea...

只需在平台特定设置中相应地更改操作系统平台默认区域设置即可。如果是 Windows,可以在此处找到带有屏幕截图的相关答案:Getting OS language in java 。如果程序本身(例如 Firefox/Chrome)也有一些与区域设置相关的设置,您可能也想在程序本身中更改它。

关于java - 处理同一页面上没有请求的丢失文件下载链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160468/

相关文章:

java - 在 EC2 实例 Ubuntu rabbitmq 上使用 RabbitMQ 线程 "main"java.net.UnknownHostException 中的异常

java - Apache Camel 合并来自不同路径的两个文件

java - 哪些 Java 库可用于生成 KML?

java - 使用 ByteArrayInputStream 从套接字接收 byte[]

java - 集群中 Akka 成员(actor)查找

java-jsf 库,具有良好的移动浏览器支持

java - 将变量传递给另一个 View : best practice

java - 跨实例同步对 MDB 方法的访问

c# - Java/C# 中的检查异常是什么?

jsf - AccordionPanel 不呈现最后一个选项卡