Java 如何在使用jsf-2和primefaces-3.4提交之前将上传的文件保存在表单中

Java 如何在使用jsf-2和primefaces-3.4提交之前将上传的文件保存在表单中,java,spring,jsf,primefaces,multifile-uploader,Java,Spring,Jsf,Primefaces,Multifile Uploader,我有很多输入字段的表单,加上primefaces组件,可以上传多个文件“p:fileUpload”,当我提交表单时,我无法获得上传的文件。。被管理的bean是“requestscope”。那么,我怎样才能在不使用ManagedBean视图范围的情况下获得上传的文件呢 上传方法 public void upload(FileUploadEvent event) { try { FacesMessage msg = new FacesMessage("Success!

我有很多输入字段的表单,加上primefaces组件,可以上传多个文件“p:fileUpload”,当我提交表单时,我无法获得上传的文件。。被管理的bean是“requestscope”。那么,我怎样才能在不使用ManagedBean视图范围的情况下获得上传的文件呢

上传方法

    public void upload(FileUploadEvent event) {
    try {
        FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        // Do what you want with the file
        String thumbnail = getDestination() + event.getFile().getFileName();
        int index = thumbnail.lastIndexOf('.');
        SystemFile systemFile = new SystemFile();
        systemFile.setAccount(getActor().getAccount());
        systemFile.setName(event.getFile().getFileName());
        systemFile.setPath(getTalentPath());

        systemFile.setFileType(FileUtil.checkFileType(thumbnail.substring(index + 1)));
        if (systemFiles == null) {
            systemFiles = new ArrayList<>();
        }
        systemFiles.add(systemFile);
        copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
    } catch (IOException ex) {
        SystemLogger.getLogger(getClass().getSimpleName()).error(null, ex);
    }
}
public void上传(FileUploadEvent事件){
试一试{
FacesMessage msg=新的FacesMessage(“已上载成功!”,event.getFile().getFileName()+);
FacesContext.getCurrentInstance().addMessage(null,msg);
//对该文件执行所需操作
字符串缩略图=getDestination()+event.getFile().getFileName();
int index=thumbnail.lastIndexOf('.');
SystemFile SystemFile=新系统文件();
setAccount(getActor().getAccount());
setName(event.getFile().getFileName());
setPath(getTalentPath());
systemFile.setFileType(FileUtil.checkFileType(thumbnail.substring(index+1));
if(systemFiles==null){
systemFiles=新的ArrayList();
}
添加(systemFile);
copyFile(event.getFile().getFileName(),event.getFile().getInputstream());
}捕获(IOEX异常){
getLogger(getClass().getSimpleName())。错误(null,ex);
}
}
素数面组件

    <p:fileUpload label="#{TalentMessages.lbl_Select_File}" fileUploadListener="#{talentPropertyAction.upload}"
                                  mode="advanced"
                                  multiple="true"
                                  uploadLabel="#{TalentMessages.lbl_upload_File}"
                                  cancelLabel="#{TalentMessages.lbl_cancel_File}"
                                  sizeLimit="2000000"
                                  oncomplete="completeUploadFile(#{talentPropertyAction.talentId});"
                                  />

然后是save函数

    @Setter
@Getter
private List<SystemFile> systemFiles;
try {
 // save something else then save the files
        if (systemFiles != null) {
            System.out.println("Not Null" + systemFiles);
            for (SystemFile systemFile : systemFiles) {
                TalentPropertyFile talentPropertyFile = new TalentPropertyFile();
                talentPropertyFile.setTalentProperty(talentProperty);
                talentPropertyFile.setFile(systemFile);
                getTalentService().save(getActor().getAccount(), talentPropertyFile);
            }
        } else {
            System.out.println("Null");
        }
    } catch (InvalidParameter ex) {
        SystemLogger.getLogger(getClass().getName()).error(null, ex);
    }
@Setter
@吸气剂
私有列表系统文件;
试一试{
//保存其他内容,然后保存文件
if(systemFiles!=null){
System.out.println(“非空”+系统文件);
对于(系统文件系统文件:系统文件){
TalentPropertyFile TalentPropertyFile=新的TalentPropertyFile();
talentPropertyFile.setTalentProperty(talentProperty);
talentPropertyFile.setFile(系统文件);
getTalentService().save(getActor().getAccount(),talentPropertyFile);
}
}否则{
System.out.println(“空”);
}
}捕捉(无效参数ex){
getLogger(getClass().getName())。错误(null,ex);
}
那么,我怎样才能在不使用ManagedBean视图范围的情况下获得上传的文件呢

只需将上传信息立即存储在一个更永久的位置,而不是作为请求范围bean的属性,请求范围bean无论如何都会在请求响应结束时被破坏(注意:每个上传都算作一个单独的HTTP请求)


如果需要一些密钥来访问它们,请考虑将密钥存储在会话范围内。

请发布相关的JSF和java bean代码,也可能需要用java和Spring/JeeIT标记它,以获得JSF页面和JavaBean代码,很抱歉,问题是当我上传文件时,它会向bean发送请求并成功上传,但当我完成表单并提交表单时,该方法无法看到上传的文件不是全部,只是相关部分,如果我们不知道您的代码是什么样子,我们将如何帮助您!为什么不给用户一个
输入
字段,只给用户一个
上传
按钮?我的意思是,用户先选择要上传的文件,然后一起上传。@dngfng:我更新了代码。我希望它能帮助你帮助我:)现在我有两个选择:1-将文件存储在磁盘上,但我如何才能将它们取回2-将文件存储在DB上,但我的DB表需要我上载文件的人才id,此选项使我请求DB的文件数与文件数一样多(性能差),我不建议将文件存储在DB中,只在磁盘中存储文件的路径,在DB中所需的空间要少得多。如所说,“如果需要一些密钥来访问它们,请考虑将密钥存储在会话范围内”。如有必要,您可以将当前登录的用户用作密钥。至于绩效,衡量就是了解。是否在数据库中存储文件仅仅是一个可移植性/可重用性/可维护性/语义性问题,而不是性能问题。不管怎么说,它最终还是同一个磁盘文件系统硬件。
public void upload(FileUploadEvent event) {
    // Now, store on disk or in DB immediately. Do not assign to a property.
}

public void save() {
    // Later, during submitting the form, just access them from there.
}