代码之家  ›  专栏  ›  技术社区  ›  Stephan

首次提交表格后无法维护上传的文件

  •  1
  • Stephan  · 技术社区  · 9 年前

    我有一个p:uploadFile组件来上传文件。此外,我有一个上传按钮,上传文件,并在一些变量中设置文件名。文件已正确上载,并在相应变量中正确设置。

    详细地

    我的xhtml页面:

    <h:form name="myUploadForm" enctype="multipart/form-data">
        <p:commandButton  action="#{controller.saveAllChanges}" value="Save" ajax="false" />
    
    
        <p:dataTable....>
            <p:column ... var="currentTableRow">
                <p:commandButton value="Upload" ajax="false" title="#{msg.upload}"
                    action="#{controller.uploadFile(currentTableRow)}"
                    update=":table" />
    
                <p:fileUpload id="upload" value="#{currentTableRow.myUploadedFile}" mode="simple"
                    skinSimple="true" label="Browse" auto="true" />
            </column>
        </p:dataTable>
    </h:form>
    

    我的控制器:

    @ManagedBean
    @ViewScoped
    public class Controller implements Serializable {
        ...
        public void uploadFile(TempDTO selectedDTO) {
            FacesContext context = FacesContext.getCurrentInstance();
    
            if (selectedDTO.getMyUploadedFile() != null && selectedDTO.getMyUploadedFile().getSize() > 0) {
                ... 
            } 
        }
    
        public saveAllChanges(){
            ....
        }
    
    }
    

    public class TempDTO {
        ...
        ...
    
    
        private UploadedFile myUploadedFile;
    
    
        public UploadedFile getMyUploadedFile() {
            return myUploadedFile;
        }
    
        public void setMyUploadedFile(UploadedFile myUploadedFile) {
            this.myUploadedFile = myUploadedFile;
        }
    }
    

    在以下情况下会注意到问题:

    1. 调试 当按下上传按钮时,我的控制器中的方法显示一切正常,文件设置正确。在那个阶段,我可以看到它的文件大小、文件名等。
    2. 现在,在不执行任何其他操作的情况下,我按“保存”按钮保存表单中的所有更改。
    3. 在此阶段,除文件外,所有更改均正确提交。TempDTO中的myUploadedFile没有文件名,因为它的大小也是零。

    value=“#{currentTableRow.myUploadedFile}” 我在上传组件中替换了每个表条目的文件。

    更新

    我在控制器中添加了一个UploadedFile,以便手动将TempDTO中的上传文件设置为:

    @ManagedBean
    @ViewScoped
    
        public class Controller implements Serializable {
    
            private UploadedFile myUploadedFile;
    
            public UploadedFile getMyUploadedFile() {
                return myUploadedFile;
            }
    
            public void setMyTemplateFile(UploadedFile myUploadedFile) {
                this.myUploadedFile = myUploadedFile;
            }
    
            public void uploadFile(TempDTO selectedDTO) {
                FacesContext context = FacesContext.getCurrentInstance();
                selectedDTO.setTemplateFile(myUploadedFile);
                if (selectedDTO.getMyUploadedFile() != null && selectedDTO.getMyUploadedFile().getSize() > 0) {
                    ... 
                } 
            }
    
            public saveAllChanges(){
                ....
            }
        }
    

    <p:fileUpload id="upload" value="#{controller.myUploadedFile}" mode="simple"
                        skinSimple="true" label="Browse" auto="true" />
    

    不,当我按下“Save”(保存)按钮并再次提交整个表单并调用saveAllChanges()时,myUploadedFile确实有一个文件名,但方法如下 getContents() 返回a 所以我仍然没有文件的内容。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Stephan    9 年前

    答案似乎如下所示: https://stackoverflow.com/a/8880083/1918516

    " "

    所以我必须在我的实现中采取一种变通方法