0

我在视图范围的 bean 中有一个简单的上传监听器,对于每个上传的文件,将其添加到列表中,然后显示列表。
问题是,当我按下上传按钮一次上传多个文件时,只有一个文件被添加到列表中,并且没有显示异常。另一方面,如果我上传单个文件,等待前一个完成,行为是正常的。
我想到了一些并发问题,但是当我尝试将 bean 放入会话范围时,它工作正常。并发问题是否有可能使视图无效?
还有什么建议吗?非常感谢

<h:form id="form" enctype="multipart/form-data">

    <p:wizard widgetVar="wiz" render="true" id="wizard">

        <p:tab id="p0" title="file upload" step="0">
            <p:panel>
                <p:fileUpload
                    fileUploadListener="#{myBean.uploadedFile}"
                     mode="advanced" multiple="true" sizeLimit="100000" 
                     update="fileList"/>

                <p:dataList id="fileList" value="#{myBean.filesName}" var="file">#{file}</p:dataList>

豆子:

public void uploadedFile(FileUploadEvent event) { 

    try {
        files.add(event.getFile());

        filesName.add(event.getFile().getFileName());

    } catch (Exception e) {

        e.printStackTrace();
    }

}
4

1 回答 1

2

我刚刚陷入和你一样的境地。经过艰苦的调试,我终于找到了一个对您也有帮助的解决方案。

我认为这个问题来自 ViewScoped 范围,在管理会话上下文中。所以我尝试自己管理会话上下文。使用此代码初始化会话和您的列表:

    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
    session.setAttribute("files", new ArrayList<UploadedFile>());

您必须初始化列表,它是强制性的。然后在您的 handleFileUpload 方法中,只需使用保存在会话上下文中的属性“文件”来保存您的上传文件。现在您的方法可以处理多个上传文件。

于 2013-12-18T08:19:08.227 回答