Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf p:fileUpload oncomplete正在执行多次_Jsf_File Upload_Primefaces - Fatal编程技术网

Jsf p:fileUpload oncomplete正在执行多次

Jsf p:fileUpload oncomplete正在执行多次,jsf,file-upload,primefaces,Jsf,File Upload,Primefaces,我想让我的用户能够上传一到四张图片 然后,这些图像将被附加到一封电子邮件中,该电子邮件将在文件上传完成后构建并发送 在将所有文件都附加到电子邮件之前,无法发送该电子邮件 我在多模式下使用fileUpload组件从用户那里获取文件,我曾希望我可以使用fileUpload组件中的oncomplete属性来实现这一点,但似乎这是为选择的每个文件调用的,而不是在上传整个列表时调用的 有没有办法在所有文件上传完毕后只回叫一次?我好像找不到 标记: <p:fileUpload

我想让我的用户能够上传一到四张图片

然后,这些图像将被附加到一封电子邮件中,该电子邮件将在文件上传完成后构建并发送

在将所有文件都附加到电子邮件之前,无法发送该电子邮件

我在多模式下使用fileUpload组件从用户那里获取文件,我曾希望我可以使用fileUpload组件中的oncomplete属性来实现这一点,但似乎这是为选择的每个文件调用的,而不是在上传整个列表时调用的

有没有办法在所有文件上传完毕后只回叫一次?我好像找不到

标记:

            <p:fileUpload id = "fileChooser"
                          label="Choose File"
                          uploadLabel="Upload File(s)"
                          cancelLabel="Start Again" 
                          skinSimple="true"
                          fileUploadListener = "#{MyController.handleFileUpload}"
                          mode = "advanced"                           
                          dragDropSupport = "false"
                          multiple = "true"
                          update = "@this"
                          sizeLimit = "4000000"                           
                          fileLimit = "4" 
                          allowTypes = "/(\.|\/)(gif|jpe?g|png)$/"
                          oncomplete="#{MyController.uploadCompleted()}" />
@Named
@SessionScoped
public class MyBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<UploadedFile> uploadedFiles;

    @PostConstruct
    public void init() {
        uploadedFiles = new ArrayList<UploadedFile>();
    }   

    public void upload(FileUploadEvent event) {     
        uploadedFiles.add(event.getFile());
    }    

    public List<UploadedFile> getUploadedFiles() {
        return uploadedFiles;
    }   
    public void setUploadedFiles(List<UploadedFile> uploadedFiles) {
        this.uploadedFiles = uploadedFiles;
    }

}
@Named
@SessionScoped
public class MyController implements Serializable {

    private static final long serialVersionUID = -261758226698276865L;

    private static final Logger LOG = Logger.getLogger(MyController.class);

    @Inject
    private MyBean myBean; 

    // This is hit every single time a file finishes uploading which is unwanted behaviour.
    public void uploadCompleted() {
        LOG.info("Uploading finished, Number of files:" + myBean.getUploadedFiles().size());
    }

    public void handleFileUpload(FileUploadEvent event) {
        LOG.info("New file upload event passed to event handler");
        LOG.info("File Name :" + event.getFile().getFileName() + " File Size:" + event.getFile().getSize());
        myBean.upload(event);       
    }

    public MyBean getMyBean() {
        return uploadNonUKLicenceBean;
    }
    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }

}

如果其他任何人遇到这种情况,当选择文件时,它们会被添加到fileUpload files属性中包含的列表中,当上载文件时,它们会从该列表中删除,因此使用p:remoteCommand,我刚刚检查了它的长度,以便在控制器为空时调用我想要的方法

(我的原始问题中有一个带有oncomplete属性的bug,当我清理要在这里发布的代码时,它悄悄地出现了,我已经根据评论在答案中更正了它)

如果有更好的方法,我很想知道

<p:fileUpload id = "fileChooser"
              label="Choose File"
              uploadLabel="Upload File(s)"
              cancelLabel="Start Again" 
              fileUploadListener = "#{nonUKLicenceCheckController.handleFileUpload}"
              mode = "advanced"                           
              dragDropSupport = "false"
              multiple = "true"
              update = "@this"
              sizeLimit = "4000000"                           
              fileLimit = "4" 
              allowTypes = "/(\.|\/)(gif|jpe?g|png)$/"
              widgetVar="uploadWidget"
              oncomplete="isFileListEmpty(PF('uploadWidget'), uploadsFinished);"
              />            
<p:remoteCommand name="uploadsFinished" actionListener="#{nonUKLicenceCheckController.uploadCompleted()}" />
<script type="text/javascript">
    function isFileListEmpty(fileupload, finished) {
    if (fileupload.files.length === 0) {
            if (finished) {
                finished();
            }
        }
    }
</script>

函数isFileListEmpty(文件上传,完成){
如果(fileupload.files.length==0){
如果(完成){
完成的();
}
}
}

并且您将oncomplete的值更改为调用javascript而不是bean(这不起作用)@Kukeltje如果要检查文件列表是否为空的javascript返回true,它将调用名为“uploadsFinished”的远程命令。这似乎对我有用。在你的问题中,你有
oncomplete=“#{MyController.uploadCompleted()}”
那不行!哦,我明白了,我明白了。我误解了你的意思,我的道歉。