p:fileUpload Listener 方法永远不会被调用 mode="simple" [重复]

Posted

技术标签:

【中文标题】p:fileUpload Listener 方法永远不会被调用 mode="simple" [重复]【英文标题】:p:fileUpload Listener method is never invoked for mode="simple" [duplicate] 【发布时间】:2013-04-26 21:22:27 【问题描述】:

我正在使用 p:fileUpload 但如果我使用 mode="simple" 则不会调用 fileUploadListener 。有什么方法可以在简单模式下使用 fileUploadListener。

<p:fileUpload id ="uploading"
              fileUploadListener="#workflowActionTemplate.handleFileUpload"
              mode="simple" 
              update="messages"
              sizeLimit="100000" 
              allowTypes="/(\.|\/)(gif|jpe?g|png|pdf)$/"
              multiple="true"/>

素数面:3.2

我已完成以下配置,如有遗漏请告诉我。

web.xml:

<!-- File Upload filter -->
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

pom.xml:

<!-- Dependancy for file upload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>3.2</version>
</dependency>

监听方法:

public void handleFileUpload(FileUploadEvent event) 
  FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded."); System.out.println("msg : "+ msg);
  uploadedFile = event.getFile();

--

如果我使用 value 属性而不是 fileUploadListener 并且我不上传文件,那么 fileUpload 属性未设置,因此出现以下错误。

javax.faces.component.UpdateModelException: javax.el.ELException: /search/workflowAction.xhtml @181,104 value="#workflowActionTemplate.uploadedFile": Can't set property 'uploadedFile' of type 'org.primefaces.model.UploadedFile' on class 'com.principal.nq.statements.search.WorkflowActionTemplate$$EnhancerByCGLIB$$6ebcb7eb' to value ''

更新

由于 fileUploadListener 无法正常工作,我还尝试通过以下方式使用 ajax 调用来更新文件值。但是f:ajax 无法执行 Primefaces p:fileUpload 组件。我也尝试过p:ajax,但这也不起作用。

<p:fileUpload id="uploading"
              value="#workflowActionTemplate.uploadedFile"
              mode="simple"
              update="messages"
              sizeLimit="100000" 
              allowTypes="/(\.|\/)(gif|jpe?g|png|pdf)$/"
              auto="true"/>
<p:growl id="messages" showDetail="true"/>
<h:commandButton id="uploadDocument" styleClass="continuebutton" value="#msg.upload" action="#workflowActionTemplate.uploadParticipantCustomDoc">
  <f:ajax execute="uploading" render="uploadDocumentDlg" onevent="onAjaxUploadCustomDoc"/>
</h:commandButton>

【问题讨论】:

@RongNK:OP 暗示使用mode="advanced" 时它可以正常工作。 @Arpit:你在嵌套表单吗? @BalusC 你是对的,它不适用于简单模式。不,我没有嵌套表格。我也尝试使用 ajax 来实现相同的功能,但 f:ajax 和 p:ajax 都无法执行 primeface p:fileUpload 组件。 ELException 表示 setter 方法缺失或错误。请注意,mode="simple" 不支持 ajax(并且与 mode="advanced" 相关的所有其他属性,例如 updatesizeLimitallowTypesauto 都被完全忽略)。因此,如果您在使用 mode="simple" 时一直尝试通过 ajax 上传,那么您首先就错了。另请参阅 RongNK 提到的链接。 @BalusC 谢谢,但我还没有解决为什么 fileUploadListener 不能在简单模式下工作。我搜索了很多也遵循了 RongNK 提供的链接中提到的步骤,但没有运气。 【参考方案1】:

请按照以下步骤使您的代码完美无缺。 在 XHTML 文件中。

    <p:fileUpload id="choose" validator="#controllerClass.validateFile" multiple="false" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"  value="#controllerclass.uploadedfile" required="true" mode="simple"/>

<p:commandButton ajax="false" id="saveBtn" update="errBrand,pnl" value="Save Brand" action="#controllerClass.uploadFile()" />

在 web.xml 中定义以下过滤器和 servlet。

  <filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>

在控制器类中你需要像这样定义方法体

使用import org.primefaces.model.UploadedFile;

private UploadedFile uploadedfile;

如果你想定义上传文件的验证方法,你可以这样写

public void validateFile(FacesContext ctx,
            UIComponent comp,
            Object value) 
        List<FacesMessage> msgs = new ArrayList<FacesMessage>();
        UploadedFile file = (UploadedFile)value;
        int fileByte = file.getContents().length;
        if(fileByte > 15360)
            msgs.add(new FacesMessage("Too big must be at most 15KB"));
        
        if (!(file.getContentType().startsWith("image"))) 
            msgs.add(new FacesMessage("not an Image file"));
        
        if (!msgs.isEmpty()) 
            throw new ValidatorException(msgs);
        
    

【讨论】:

感谢您的回答,但我不确定我是否能够对此进行测试,因为我现在不再从事该领域的工作。无论如何,我感谢您的帮助。

以上是关于p:fileUpload Listener 方法永远不会被调用 mode="simple" [重复]的主要内容,如果未能解决你的问题,请参考以下文章

p:fileUpload 中的监听器方法永远不会在 primefaces 中调用 [重复]

p:fileUpload 未在支持 bean 中设置上传的文件 [重复]

如何将上传的图片从 p:fileUpload 插入 MySQL 中的 BLOB?

<p:fileUpload> 总是给我空内容[重复]

如何在简单模式和 ajax="true" 中使用 <p:fileUpload>?

p:fileupload图像预览不起作用