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