これは私の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はあなたの最初の問題は、あなたがAjaxリクエストでファイルをダウンロードしようとしているということです
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;
}
今はテストする時間がありませんが、プライムフェイスAPI内のAJAXコールがダウンロード要求を「食べている」ということは間違いありません。あなたが見なければならないのは、actionlistenerを使用する代わりに、ダウンロードファイルのためにajax = "false" 'で
を表示することです。これにより、更新をトリガーする代わりに持続するリンク(事前に動的に変更することができます)が作成されます。私はテーブルと同様の問題を抱えていましたが、これはすぐにそれをノックアウトしました。がんばろう。 –ありがとう!
はajaxタグを置き換えますか?またはtreeNodeタグ(ドキュメントを表示するタグ)? – BRabbit27