为PrimeFaces显示fileupload的多个message / growl消息

时间:2017-06-22 08:07:27

标签: java file-upload primefaces

我想根据通过primeface中的fileuploader上传的文件显示x号的message / growl。

目前,它只会显示最新消息。其余部分将不会显示。无论如何,节目最后可以绕过吗?或另一种选择?

所以如果我上传4个文件。无论成功与否,我希望它能显示4条消息。每个文件1个。

的index.xhtml:

<h:form id="form">
        <p:messages id="messages" autoUpdate="true" showDetail="true" closable="true" />

        <p:fileUpload fileUploadListener="#{fileUploadAction.upload}"
            mode="advanced" allowTypes="/(\.|\/)(asc)$/" dragDropSupport="true" update="messages" />
</h:form>

FileUploadAction.java:

public void upload(FileUploadEvent event)
    {   
        String filename = event.getFile().getFileName();

        try
        {
            copyFile(filename, event.getFile().getInputstream());

            FacesContext.getCurrentInstance().addMessage(filename, new FacesMessage(FacesMessage.SEVERITY_INFO, "msg.header", filename + " is uploaded."));
        }
        catch (IOException e)
        {
            FacesContext.getCurrentInstance().addMessage(filename, new FacesMessage(FacesMessage.SEVERITY_ERROR, "err.header", e.getLocalizedMessage()));
        }
    }

    public void copyFile(String fileName, InputStream in)
    {
        try
        {
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(new File(PropertiesUtil.LOCAL_PATH + fileName));

            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1)
            {
                out.write(bytes, 0, read);
            }

            in.close();
            out.flush();
            out.close();
        }
        catch (IOException e)
        {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "err.header", e.getLocalizedMessage()));
        }
    }

1 个答案:

答案 0 :(得分:1)

由于fileUpload正在更新每个文件上传的消息或咆哮,因此正在从DOM中清除以前的消息,尤其是在快速提供请求的情况下。

为了保持咆哮声不变,并显示多条消息,您可以执行以下操作:

首先是咆哮组件:

<p:growl widgetVar="growlWV" showDetail="true" />

确保定义widgetVar,稍后将使用它。

文件上传:

<p:fileUpload fileUploadListener="#{fileUploadAction.upload}"
        mode="advanced" allowTypes="/(\.|\/)(asc)$/" dragDropSupport="true" />

确保您没有更新fileUpload中的咆哮。

上传处理方法中的第二个:

RequestContext.getCurrentInstance().execute("PF('growlWV').renderMessage("
            + "{\"summary\":\"summary goes here\""
            + ", \"detail\":\"" + event.getFile().getFileName() + "\""
            + ", \"severity\":\"warn\"})");

你可以用一个不那么混乱的语法来定义自己的js函数,然后在执行中调用上面的js而不是所有这些+ \来更整洁,但我猜你有了这个想法。

相关问题: Show growl using Javascript