【问题标题】:Before Upload event in PrimeFaces 3.5PrimeFaces 3.5 中的 Upload 事件之前
【发布时间】:2026-01-25 18:10:01
【问题描述】:

是否可以在 PrimeFaces 3.5 中上传文件之前进行一些服务器端处理?假设表单包含一些p:inputText 元素,需要在文件上传之前填写,那么我该如何检查呢?有什么活动吗?

视图看起来像-

<h:form enctype="multipart/form-data">
    <p:inputText value="#{fileUploadController.name}" id="name" label="Name" />
    <p:inputText value="#{fileUploadController.about}" id="about" label="About" />
    <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
            mode="advanced" 
            update="messages"
            sizeLimit="100000" 
            allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

    <p:growl id="messages" showDetail="true"/>

</h:form>

ManagedBean 在下面-

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

public class FileUploadController {

    private String name;
    private String about;
    //Getters & Setters

    public void beforeUpload(){
    if(getName().isEmpty()||getAbout().isEmpty())
        FacesMessage msg = new FacesMessage("Error", "Name or About cannot be empty");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void handleFileUpload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

【问题讨论】:

  • 我相信您正在寻找错误方向的解决方案。 handleFileUpload 的目的不是处理表单提交。它只是为了记住迄今为止上传的文件。我宁愿添加一个“保存”按钮来完成业务工作。
  • @BalusC:好主意。我可以根据您的建议更改逻辑。谢谢。

标签: jsf-2 primefaces


【解决方案1】:

&lt;p:fileUpload/&gt; 有一个 onStart 属性,您可以方便地与 &lt;p:remoteCommand/&gt; 组件连接,以在上传操作开始之前触发支持 bean 操作

      <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
        mode="advanced" 
        onstart="startSomething();"
        update="messages"
        sizeLimit="100000" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

      <p:remoteCommand name="startSomething" action="#{bean.startSomething}"/>  

【讨论】:

    【解决方案2】:

    我在文本字段和文件上传方面遇到了类似的情况。除了检查 handleFileUpload 中的名称值外,我找不到任何其他方法。

    public void handleFileUpload(FileUploadEvent event){
      HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();`
      name =req .getRequestParams("formId:name")
      if(name==null){
       FacesMessage msg = new FacesMessage("Error", "Name or About cannot be empty")
       return;
      }
    }
    

    【讨论】: