我的目标是在PrimeFaces v3.5中fileUpload
成功后隐藏上传组件。以下是视图片段 -
<h:form>
<!-- Here are some more components of PrimeFaces, So i am not updating the entire form-->
<p:fileUpload id="fileUpload"
rendered="#{!fileUploadController.hidden}"
label="Choose Script to upload here"
style="font-size: 100% !important;" showButtons="false"
fileUploadListener="#{fileUploadController.upload}"
mode="advanced" auto="true" sizeLimit="100000"
allowTypes="/(\.|\/)(py|txt)$/" update="fileUpload" />
<!-- Here are some more components of PrimeFaces, So i am not updating the entire
</h:form>
我的Managed Bean
位于 -
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FilenameUtils;
import org.primefaces.event.FileUploadEvent;
@ManagedBean
@ViewScoped
public class FileUploadController implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
// private String destination = null;
private String destination = "D:/temp";
private boolean hidden = false;
public FileUploadController() {
// System.out.println("destination=" + destination);
}
// private String destination = "D:/download";
public void upload(FileUploadEvent event) {
String fileName = FilenameUtils.getName(event.getFile().getFileName());
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
"Success! ", fileName + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
try {
System.out.println("I am trying to copy it...");
copyFile(fileName, event.getFile().getInputstream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void copyFile(String fileName, InputStream in) {
try {
System.out.println("filename= " + fileName + ", dest="
+ destination);
// write the inputStream to a FileOutputStream
OutputStream out = new FileOutputStream(new File(destination
+ File.separator + fileName));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = in.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
in.close();
out.flush();
out.close();
System.out.println("New file created!");
setHidden(true);
} catch (IOException e) {
System.out.println("ERROR " + e.getMessage());
}
}
/**
* @return the hidden
*/
public boolean isHidden() {
return hidden;
}
/**
* @param hidden
* the hidden to set
*/
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
}
文件上传已成功完成,但fileUpload
未隐藏。
答案 0 :(得分:8)
您无法ajax更新自身有条件渲染的组件。 JSF ajax引擎JavaScript不会在HTML DOM树中添加/删除更新目标,而是替换HTML DOM树中的更新目标。如果没有呈现JSF组件,那么JSF ajax引擎将无法替换任何内容。相反,您需要ajax更新始终呈现的父级。你可以使用<h:panelGroup>
来获取它。
<h:panelGroup id="fileUploadGroup">
<p:fileUpload id="fileUpload"
rendered="#{!fileUploadController.hidden}"
...
update="fileUploadGroup" />
</h:panelGroup>