ajax - 我如何使用 <p :fileUpload> with mode simple and ajax ="true"?

标签 ajax file-upload jsf-2 primefaces

我想使用 PrimeFaces 和 ManagedBean 上传文件。我要使用 p:fileUpload模式=“简单”。

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()" />

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);
        }
    }
    }
}  

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

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

最佳答案

<p:fileUpload mode="simple">不支持ajax。对不起,但这是故事的结局。

如果切换到兼容 ajax 的 <p:fileUpload mode="advanced">真的不是一种选择,那么最好的办法是升级到 JSF 2.2 并使用其新的原生 <h:inputFile>组件代替。它还显示在浏览器的默认外观中,并且能够通过隐藏的 iframe 技巧模拟 ajax 体验。

也可以看看:

  • How to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile is null


  • 无关 对于具体问题,您 fileUpload() 中的这两个论点action方法完全没有必要。只是
    action="#{itemBean.fileUpload}"
    


    public void fileUpload() {
        // ...
    }
    

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

    关于ajax - 我如何使用 <p :fileUpload> with mode simple and ajax ="true"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19996774/

    相关文章:

    javascript - 无法对 Firefox 扩展中的 Ajax 响应执行任何操作

    javascript - Firefox 和 Chrome 中的文本转语音差异

    curl - 不推荐使用@filename API 进行文件上传。请改用 CURLFile 类

    php-chmod() : No such file or directory

    jsf - selectBooleanCheckbox 的标签 'for' id 是什么

    php - 当另一个ajax调用更改div y的内容时,如何自动更改div x(使用ajax)的内容?

    javascript - 如何获取 xmlhttprequest (AJAX) 的 URL

    javascript - 无法将图像上传到 S3

    java - JSF 通过 session 传递 POJO

    java - 如何获取 session 中所有已初始化的托管 bean?