Spring Primefaces fileupload仅适用于要上载的第一个文件

Spring Primefaces fileupload仅适用于要上载的第一个文件,spring,jsf,file-upload,primefaces,web.xml,Spring,Jsf,File Upload,Primefaces,Web.xml,我使用的是Primefaces,文件上传程序有问题。问题是它在我上传的第一个文件(fileUploadListener被调用,java方法上传该文件)上运行良好,但是如果我尝试上传另一个文件,则不再调用侦听器,java方法也不会被触发。如果我刷新页面,我可以上传另一个文件,但是如果我尝试上传第二个文件,同样的事情也会发生 xhtml文件中的代码: java bean文件中的代码: public void handleFileUpload(FileUploadEvent事件){ Externa

我使用的是Primefaces,文件上传程序有问题。问题是它在我上传的第一个文件(fileUploadListener被调用,java方法上传该文件)上运行良好,但是如果我尝试上传另一个文件,则不再调用侦听器,java方法也不会被触发。如果我刷新页面,我可以上传另一个文件,但是如果我尝试上传第二个文件,同样的事情也会发生

xhtml文件中的代码:


java bean文件中的代码:

public void handleFileUpload(FileUploadEvent事件){
ExternalContext extContext=FacesContext.getCurrentInstance().getExternalContext();
字符串filename=FilenameUtils.getName(event.getFile().getFileName());
文件结果=新文件(extContext.getRealPath(“//上传/”+文件名));
试一试{
FileOutputStream FileOutputStream=新的FileOutputStream(结果);
字节[]缓冲区=新字节[6124];
整块;
InputStream InputStream=event.getFile().getInputstream();
while(true){
bulk=inputStream.read(缓冲区);
如果(体积<0){
打破
}
写入(缓冲区,0,大容量);
fileOutputStream.flush();
}
fileOutputStream.close();
inputStream.close();
messageTitle=“Message”;
messageBody=“已成功上载文件“+event.getFile().getFileName()+”;
FacesContext.getCurrentInstance().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_INFO,messageTitle,messageBody));
}
捕获(IOE异常){
e、 printStackTrace();
messageTitle=“Message”;
messageBody=“文件未上传”;
FacesContext.getCurrentInstance().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_INFO,messageTitle,messageBody));
FacesMessage error=新建FacesMessage(FacesMessage.SEVERITY_error,“文件未上载!”,“”);
FacesContext.getCurrentInstance().addMessage(null,错误);
}
}
web.xml文件中的代码:


PrimeFaces文件上载筛选器
org.primefaces.webapp.filter.FileUploadFilter
上传目录
/此处已上载/临时
阈值大小
20971520
PrimeFaces文件上载筛选器
Facesservlet

我想我已经找到了问题所在,但我不确定是什么导致了这个问题。
我用来显示fileUpload组件的xhtml页面有许多选项卡,每个选项卡都有自己的h:form。我创建了一个只有一个表单的新页面,fileUpload组件在那里似乎工作正常。

我也遇到了同样的问题,我在这里找到了一个解决方案(解决方案比解决方案多):

FileUpload组件中的isTransient()方法似乎有问题。 希望有帮助。

我补充道:

event.getComponent().setTransient(false);
在文件上载侦听器方法中

public void handleUpload(FileUploadEvent event) {
    ....
}

很好。

我忘了提到我使用的是primefaces 3.3.1和tomcat 7。上传后您是否尝试更新整个表单,而不仅仅是消息?谢谢您的回复!这不是一个更新问题,而是一些与Ajax不能正常工作相关的问题。fileUploadListener只为要上载的第一个文件调用java方法,但在这之后,如果我尝试使用第二个文件,则不会???你的handleFileUpload方法确实有效。您的p:tab标签周围是否有另一个表单标签?PatientHandleAction的作用域是什么?我在p:tab周围没有其他表单标记,但是我有很多p:tab,在每个p:tab中我使用一个表单。我正在使用的bean具有作用域会话。通过使用iFrame(p:lightBox)来显示上传文件,我已经解决了这个问题。上传文件是一个具有单个表单的页面,这对我来说很好。
<filter>
   <filter-name>PrimeFaces FileUpload Filter</filter-name>
   <filter-class>
      org.primefaces.webapp.filter.FileUploadFilter
   </filter-class>
   <init-param>
      <param-name>uploadDirectory</param-name>
      <param-value>/HerEhrUploaded/temp</param-value>
   </init-param>
   <init-param>
      <param-name>thresholdSize</param-name>
      <param-value>20971520</param-value>
   </init-param>      
</filter>

<filter-mapping>
   <filter-name>PrimeFaces FileUpload Filter</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
event.getComponent().setTransient(false);
public void handleUpload(FileUploadEvent event) {
    ....
}