这是我xhtml-code
下载文件
<p:tree value="#{documentsController.root}"
var="node" selectionMode="single"
dynamic="true">
<p:treeNode
expandedIcon="ui-icon-folder-open"
collapsedIcon="ui-icon-folder-collapsed">
<h:outputText value="#{node}" />
</p:treeNode>
<p:treeNode type="file" icon="ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{documentsController.onNodeSelect}"/>
</p:tree>
,这是支持bean
@ManagedBean
@ViewScoped
public class DocumentsController implements Serializable {
TreeNode root;
//TreeNode[] selectedNodes;
@PostConstruct
public void init() {
root = new DefaultTreeNode("SRC", null);
TreeNode node0 = new DefaultTreeNode("A", root);
TreeNode node1 = new DefaultTreeNode("B", root);
TreeNode node2 = new DefaultTreeNode("C", root);
TreeNode node3 = new DefaultTreeNode("file", "D", node0);
TreeNode node4 = new DefaultTreeNode("file", "E", node0);
TreeNode node5 = new DefaultTreeNode("file", "F", node0);
String p = "C:\\Users\\federico.martinez\\Desktop\\a.wmv";
TreeNode node6 = new DefaultTreeNode("file", new File(p), node1);
TreeNode node7 = new DefaultTreeNode("file", "h", node1);
TreeNode node8 = new DefaultTreeNode("file", "i", node1);
}
public TreeNode getRoot() {
return root;
}
/*
public void setSelectedNodes(TreeNode[] selectedNodes){
this.selectedNodes = selectedNodes;
}
public TreeNode[] getSelectedNodes(){
return selectedNodes;
}*/
public void onNodeSelect(NodeSelectEvent event) {
if (event.getTreeNode().getType().equals("file")) {
File file = new File(event.getTreeNode().getData().toString());
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.setResponseHeader("Content-Type", externalContext.getMimeType(file.getName()));
externalContext.setResponseHeader("Content-Length", String.valueOf(file.length()));
externalContext.setResponseHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(file);
output = externalContext.getResponseOutputStream();
IOUtils.copy(input, output);
} catch (FileNotFoundException ex) {
System.out.println("FileNotFound: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("IO: " + ex.getMessage());
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(input);
}
facesContext.responseComplete();
}
}
}
但它不是下载文件,我用战斧树这种下载方法和它的工作,现在我想与PrimeFaces,但这不会下载该文件,并没有错误!
任何意见可能是错误的?
在此先感谢!
UPDATE
我有这样的修改,但不能让它下载文件。
<p:tree value="#{documentsController.root}"
var="node" selectionMode="single"
dynamic="true">
<p:treeNode
expandedIcon="ui-icon-folder-open"
collapsedIcon="ui-icon-folder-collapsed">
<h:outputText value="#{node}" />
</p:treeNode>
<p:treeNode type="file" icon="ui-icon-document">
<p:commandButton value="#{node}" ajax="false">
<p:fileDownload value="#{documentsController.download(node)}" />
</p:commandButton>
</p:treeNode>
</p:tree>
和backbean是
public void download(String path) {
File f = new File(path);
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
InputStream is = ((ServletContext)externalContext.getContext()).getResourceAsStream(path);
file = new DefaultStreamedContent(is, externalContext.getMimeType(f.getName()), f.getName());
}
public StreamedContent getFile(){
return file;
}
我现在没有时间去测试它 - 但有可能是因为其在“吃”您的请求下载的primefaces API中的AJAX调用。你应该看看,而不是使用actionlistener显示下载文件的
和'ajax =“false”'。这将创建一个链接(它可以提前动态更改),该链接将持续而不是触发更新。我在桌子上遇到了类似的问题,并且很快就将其解决了。祝你好运。 – 2011-12-22 01:37:53非常感谢!
替换了ajax标签?或者treeNode标签(显示文档的标签)? – BRabbit27 2011-12-22 05:21:10