我正在尝试上传带有标识文件的参数的文件,例如,如果有参数角色,其中包含student作为值,则上传文件应包含学生详细信息。
所以在单个表单中我尝试捕获roleid并使用<p:fileUpload>
,在这里当我选择角色并单击文件上传器时,所选角色id被捕获为null
我正在使用JSF p:fileUpload
以下是代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:body>
<ui:composition template="/templates/layout.xhtml">
<ui:define name="content">
<h:form enctype="multipart/form-data">
<p:panel>
<h:panelGrid id="grid">
<h:outputLabel for="role" value="Role" style="font-weight:bold" />
<p:selectOneMenu id="role" value="#{userBean.selectedroleid}"
style="width:100%">
<f:selectItem itemLabel="Select User Type" itemValue="" />
<f:selectItems value="#{userBean.roles}" var="role"
itemLabel="#{role.role}" itemValue="#{role.id}" />
</p:selectOneMenu>
<h:outputText value="" />
</h:panelGrid>
<f:facet name="footer">
<p:fileUpload fileUploadListener="#{userBean.readCSVFile}"
mode="advanced" dragDropSupport="false" fileLimit="1"
allowTypes="/(\.|\/)(csv)$/" label="Select" immediate="true" />
<p:commandButton value="Save" action="#{userBean.readCSVFile1()}"
style="margin:0px" update="grid" icon="ui-icon-disk"
validateClient="true" />
</f:facet>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
用户bean:捕获角色和文件
@ManagedBean
@ViewScoped
public class UserBean implements Serializable {
@Inject
private RoleService roleService;
private Integer selectedroleid;
private List<Role> roles;
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@PostConstruct
public void initialize() {
this.roles = roleService.getRoles();
}
public void readCSVFile(FileUploadEvent event) throws IOException {
logger.debug("Reading data from csv and convert to java object:");
System.out.println("selected role Id " + selectedroleid);
System.out.println("selected file " + event.getFile().getFileName());
}
public void readCSVFile1() throws IOException {
logger.debug("Reading data from csv and convert to java object:");
System.out.println("selected role Id " + selectedroleid);
}
public Integer getSelectedroleid() {
return selectedroleid;
}
public void setSelectedroleid(Integer selectedroleid) {
System.out.println(" selected role id "+ selectedroleid);
this.selectedroleid = selectedroleid;
}
}
我在Web.xml中也有上传过滤器映射,用于使用JSF上传文件。
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
<init-param>
<param-name>thresholdSize</param-name>
<param-value>2097152</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
但问题是,如果我选择角色并单击文件上传器,则选择的角色ID被捕获为null,就好像我单击“保存”按钮一样,角色的正确值将被捕获到用户bean。
我希望获得角色ID以及文件上传或者我想在同一页面中捕获角色和文件的方式。
答案 0 :(得分:1)
您可以使用remoteCommand
将值传递给支持bean。尝试这样的事情:
<p:remoteCommand name="passValue">
<f:setPropertyActionListener for="role"
value="#{userBean.selectedroleid}"
target="#{userBean.selectedroleid}"/>
</p:remoteCommand>
然后将onStart
选项添加到您的fileUploader,如:
onstart="passValue()"
答案 1 :(得分:1)
这是一个古老的问题,但是我已经用primefaces 6.2遇到了这个问题
问题的原因:文件上传应该是表单的单个输入,也可以是ajax请求(在mode =“ advanced”的情况下),而无需发布/处理其他输入。
我的解决方法:上传侦听器仅存储文件,而业务逻辑(以及其他输入)在remoteCommand中完成:
xhtml:
<h:form>
<p:inputText value="#{helloWorld.msg}" />
...
<p:fileUpload mode="advanced" auto="true"
fileUploadListener="#{helloWorld.handleUpload}"
oncomplete="uploadBusinessLogic();"/>
<p:remoteCommand name="uploadBusinessLogic" actionListener="#{helloWorld.uploadBusinessLogic}"/>
</h:form>
bean:
private String msg;
private InputStream file;
public void handleUpload(FileUploadEvent event) {
try {
this.file = event.getFile().getInputstream();
} catch (IOException e) {
//...
}
}
public void uploadBusinessLogic() {
// msg and file is up to date
}