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

use*_*922 7 ajax file-upload primefaces jsf-2

我想上传一个使用PrimeFaces和ManagedBean的文件.我想用p:fileUploadmode ="simple".

XHTML代码:

    <p:fileUpload id="fileId" mode="simple" value="#{itemBean.upFile}"
        fileLimit="1" />
    <p:commandButton ajax="true" value="Upload File" update="messagess"
                     id="save-btn"
                     actionListener="#{itemBean.fileUpload(itemBean.upFile,itemBean.hiddenFileName)}"
                     process="@this" oncomplete="showImage()" />
Run Code Online (Sandbox Code Playgroud)

ManagedBean:

public void fileUpload(UploadedFile uploadFile, String hiddenKey) {  
    String keyFileName = hiddenKey;

    boolean validFile = true;
    String expression = "([^\\s]+(\\.(?i)(gif|jpg|jpeg|gif|png|PNG|GIF|JPG|JPEG|bmp))$)";
    if((uploadFile == null) ) {
        validFile = false;
        FacesMessage msg = new FacesMessage("Error! "+ "Please select an image.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }  
    else {
    System.out.println("going to file upload"+uploadFile.getFileName()+"---hiddenKey"+keyFileName);
    if((!uploadFile.getFileName().matches(expression)) ) {
        validFile = false;
        FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName() + " is not an image.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    if(uploadFile.getSize() > 1000000) {
        validFile = false;
        FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName() + " size is too large.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    if (validFile) {
        // Do what you want with the file        
        try {
            //String extn =uploadFile.getFileName().substring(uploadFile.getFileName().lastIndexOf("."));


            copyFile(uploadFile.getFileName(), uploadFile.getInputstream());

            FacesMessage msg = new FacesMessage("Success! "+ uploadFile.getFileName() + " is uploaded.");  
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (IOException e) {
            e.printStackTrace();
            FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName()+ " not uploaded.");  
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
    }
}  
Run Code Online (Sandbox Code Playgroud)

我的问题是,我点击了命令按钮,并且没有调用辅助bean中的方法.如果我使用ajax="false"该方法被调用,但页面得到了刷新.

如何使用ajax="true"<p:fileUpload>在一起?

Bal*_*usC 9

<p:fileUpload mode="simple">不支持AJAX.对不起,但这是故事的结尾.

如果切换到ajax兼容<p:fileUpload mode="advanced">实际上不是一个选项,那么最好的办法是升级到JSF 2.2并使用其新的原生<h:inputFile>组件.它还显示在浏览器默认的look'n'feel中,并且能够通过隐藏的iframe技巧模拟ajax体验.

也可以看看:


具体问题无关,fileUpload()操作方法中的这两个参数完全没有必要.只是

action="#{itemBean.fileUpload}"
Run Code Online (Sandbox Code Playgroud)

public void fileUpload() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

删除process="@this"属性后,效果一样好.

  • 通过隐藏的iframe技巧模拟ajax体验?你能解释一下吗?谢谢 (3认同)

归档时间:

查看次数:

16364 次

最近记录:

10 年 前