2012-04-12 55 views
0

也许我错过了一些明显的东西,但我似乎无法弄清楚如何使这项工作。提交p:fileupload与表格的其余部分

我有一个p:对话框,它包含一个文本字段,一个选择菜单,一个自动完成,一个编辑器和一个文件上传对象。这个想法是,用户将输入一些信息到字段中,可选地将一些文件附加到fileupload上,然后按下将调用我的支持bean的对话框上的提交按钮,执行一些处理并处理将文件放在需要的位置。我想使用高级文件上传器,以便用户可以附加多个文件。当用户按下提交按钮时,除了fileuploader之外,所有数据都会正确提交。上传侦听器永远不会被触发。

我做了一些在线搜索,发现一些引用可能能够通过调用wigdetVar.upload()来触发上传,但那只是抛出一个javascript错误,并且进一步搜索表明功能可能不再可用。

所以问题是,我怎样才能提交文件与表单的其余部分从提交按钮?对话框的代码如下。

<p:dialog widgetVar="newthreaddialog" modal="true" header="New Thread for #{collaborationBacking.patientName}" dynamic="true" 
         resizeable="false"> 
       <div class="whitebox"> 
       <h:form id="newthreadform" enctype="multipart/form-data"> 
        <p:panelGrid> 
         <p:row> 
          <p:column> 
          <p:messages/> 
          <h:outputLabel for="threadtitle" value="Thread Title: "/> 
          <p:inputText id="threadtitle" label="Thread Title" value="#{newCollabThreadBacking.title}" required="true"/> 
          </p:column> 
          <p:column> 
          <h:outputLabel for="threadtype" value="Type: "/> 
          <h:selectOneMenu id="threadtype" label="Thread Type" value="#{newCollabThreadBacking.type}"> 
           <f:selectItems value="#{newCollabThreadBacking.typeList}"/> 
          </h:selectOneMenu> 
          </p:column> 
         </p:row> 

         <p:row> 
          <p:column colspan="2"> 
          <h:outputLabel for="addressedTo" value="To: "/> 
          <p:autoComplete id="addressedTo" value="#{newCollabThreadBacking.addressedTo}" 
                completeMethod="#{newCollabThreadBacking.completeAddress}" 
                var="practice" 
                itemValue="#{practice}" 
                itemLabel="#{practice.name}" 
                converter="practiceConverter" 
                forceSelection="true"/> 
          </p:column> 
         </p:row> 


         <p:row> 
          <p:column colspan="2"> 
          <p:editor value="#{newCollabThreadBacking.content}" label="Message Content" required="true"/> 
          </p:column> 
         </p:row> 

         <p:row> 
          <p:column colspan="2"> 
          <p:fileUpload widgetVar="uploader" fileUploadListener="#{newCollabThreadBacking.fileUpload}"/> 
          </p:column> 
         </p:row> 

         <p:row> 
          <p:column colspan="2"> 
          <span class="submit"> 
           <p:commandButton id="submitthread" value="Submit" action="#{newCollabThreadBacking.saveThread}" 
                  oncomplete="newThreadResult(xhr, status, args)" 
                  onclick="uploader.upload();" 
                  process="@form" update="@form"/> 
          </span> 
          </p:column> 
         </p:row>        
        </p:panelGrid> 
       </h:form> 
       </div> 

       <p:ajax event="close" listener="#{collaborationBacking.reloadThreads}" update="threadtable newthreadform"/> 
      </p:dialog> <!-- newthreaddialog --> 

回答

0

您是否添加了文件上传过滤器?您需要在web.xml文件中添加fileUpload过滤器,以便能够将文件上载到服务器。尝试添加以下内容到您的web.xml中

<filter> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 
+0

是的,我确实补充了这一点。如果点击上传按钮,上传侦听器将被调用,但如果提交表单则不会。 – moneyt 2012-04-16 12:38:37

+0

@moneyt我可以看到你的支持bean代码吗?尝试改变范围 – fareed 2012-06-09 11:03:02

+0

对不起,我感觉丢弃了那套代码。为了主要解决这个问题,我把文件上传器自动上传到一个临时位置,然后让表单提交句柄将临时文件移动到永久的家中。我不认为我在任何地方的版本控制中都有该代码的副本。尽管感谢您的帮助。 – moneyt 2012-06-19 19:15:08