Java 如何在使用jsf-2和primefaces-3.4提交之前将上传的文件保存在表单中
我有很多输入字段的表单,加上primefaces组件,可以上传多个文件“p:fileUpload”,当我提交表单时,我无法获得上传的文件。。被管理的bean是“requestscope”。那么,我怎样才能在不使用ManagedBean视图范围的情况下获得上传的文件呢 上传方法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!
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.
}