【问题标题】:Validating dimensions of an uploaded image in file upload listener in PrimeFaces在 PrimeFaces 的文件上传侦听器中验证上传图像的尺寸
【发布时间】:2014-03-26 11:15:45
【问题描述】:

我正在使用<p:fileUpload> 上传图片,如下所示。

<p:outputLabel for="txtCatImage" value="#{messages['category.image']}"/>

<p:fileUpload id="txtCatImage" mode="advanced" 
              dragDropSupport="true" required="true"
              sizeLimit="1000000" fileLimit="1" multiple="false" 
              cancelLabel="#{messages['fileupolad.cancelLabel']}"
              label="#{messages['fileupolad.label']}"
              uploadLabel="#{messages['fileupolad.uploadLabel']}" 
              allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
              invalidFileMessage="#{messages['fileupolad.invalidFileMessage']}"
              invalidSizeMessage="#{messages['fileupolad.invalidSizeMessage']}"
              fileLimitMessage="#{messages['fileupolad.fileLimitMessage']}"
              fileUploadListener="#{categoryManagedBean.fileUploadListener}"/>
<p:message for="txtCatImage" showSummary="false"/>

<p:commandButton id="btnSubmit" update="panel messages"
                 actionListener="#{categoryManagedBean.insert}"
                 value="#{messages['button.save']}"/>

fileUploadListener在对应的被@ViewScoped修饰的托管bean中如下。

//This is just a utility method and can be placed anywhere in the application.
private static boolean validateImageDimensions(byte[] bytes) throws IOException {
    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(bytes));        
    return bufferedImage.getHeight()>=750 || bufferedImage.getWidth()>=650;
}

public void fileUploadListener(FileUploadEvent event) throws IOException {
    UploadedFile uploadedFile = event.getFile();
    byte[] bytes = IOUtils.toByteArray(uploadedFile.getInputstream());

    if(!Utility.validateImageDimensions(bytes)) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.validationFailed();
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Message summary", "Error message");
        FacesContext.getCurrentInstance().addMessage(event.getComponent().getClientId(context), message);
    }
    else {//Do something.}
}

&lt;p:commandButton&gt; 的监听器如下,如果fileUploadListener() 中的验证失败,则应该被调用。

public void insert() {
    //Code to invoke an EJB to insert a new row along with the uploaded file.
}

如果if(!Utility.validateImageDimensions(bytes)) 被评估为真,那么&lt;p:commandButton&gt; 的动作监听器(上面的insert() 方法)应该被调用,但是它被调用并且这种验证意味着没有完全没有效果。

As already stated,PrimeFaces 文件上传验证器不起作用。

我在这里做错了什么?上传图片的尺寸验证方法是什么?

【问题讨论】:

    标签: validation jsf file-upload primefaces jsf-2.2


    【解决方案1】:

    您的具体问题是因为上传操作发生在与保存操作不同的 HTTP 请求中。您首先选择了文件,然后按上传(请求#1),然后按保存按钮(请求#2),对吗?浏览器内置开发人员工具集中的网络监视器(按 F12)也应该确认它。 FacesContext#validationFailed() 本质上是请求范围的,就像 FacesContext 本身一样。因此,当您在调用上传操作的请求期间设置它时,它只是在调用保存操作的请求期间“重置”。

    这确实有些尴尬。由于&lt;p:fileUpload mode="advanced"&gt; 不支持Validators,正如您已经发现的那样,对于这个问题并没有真正的干净解决方案。您应该摆弄一个视图范围的 bean 属性来维护同一视图上请求的验证状态。

    private boolean validationFailed;
    
    public void fileUploadListener(FileUploadEvent event) throws IOException {
        // ...
        validationFailed = !Utility.validateImageDimensions(bytes);
    
        if (validationFailed) {
            // Add message.
        }
        else {
            // Process upload.
        }
    }
    
    public void insert() {
        if (validationFailed) {
            // Add message.
        }
        else {
            // Process insert.
        }
    }
    

    顺便说一句,我不想​​将这些消息设置为FATAL,而是设置为ERROR。最终用户能够自行修复所有问题。

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 2021-06-09
      • 1970-01-01
      • 2020-02-22
      • 2012-05-11
      • 1970-01-01
      • 2013-03-31
      • 2014-12-10
      • 2017-08-11
      相关资源
      最近更新 更多