Вы пытались использовать <p:commandButton>
с <p:fileDownload>
?
<p:commandButton
value="Download"
title="Download"
image="ui-icon-arrowthick-1-s"
ajax="false">
<p:fileDownload value="#{myBean.fileStreamedContent}" />
</p:commandButton>
в своем компоненте (например, если ваши файлы JPEG):
public StreamedContent getFileStreamedContent() {
try {
InputStream is = new BufferedInputStream(
new FileInputStream("/your/file/path/fileXYZ.jpg"));
return new DefaultStreamedContent(is, "image/jpeg", "fileXYZ.jpg");
} catch (FileNotFoundException e) {
}
}
Последняя часть связывает определенный файл с конкретным узлом дерева.Вы можете использовать атрибуты <p:tree>
selectionMode="single"
и selection="#{myBean.selectedTreeNode}"
.Пользователь выбирает узел дерева, и это приведет к тому, что selectedTreeNode
будет установлен (с помощью метода установки) для вашего компонента.
private TreeNode selectedTreeNode;
public void setSelectedTreeNode(TreeNode selectedTreeNode) {
this.selectedTreeNode = selectedTreeNode;
if (this.selectedTreeNode != null) {
Object yourTreeNodeData = this.selectedTreeNode.getData();
// do whatever you need to do with the data object...
}
}
В методе getFileStreamedContent()
просто используйте имя файла, хранящееся в вашемОбъект узла дерева в качестве параметра для конструктора FileInputStream()
.
EDIT
Вместо того, чтобы пытаться встраивать командные кнопки в дерево, предоставьте одну командную кнопку где-нибудь настр.Когда выбран узел дерева, он может установить связанный файл (для загрузки) в качестве свойства вашего компонента.Сделайте так, чтобы ваше дерево выглядело так:
<p:tree
value="#{myBean.rootTreeNode}"
var="node"
selectionMode="single"
selection="#{myBean.selectedTreeNode}">
<p:ajax event="select" listener="#{myBean.onNodeSelect}" />
<p:ajax event="unselect" listener="#{myBean.onNodeUnselect}" />
</p:tree>
public void onNodeSelect(NodeSelectEvent event) {
// put some logging here...
}
public void onNodeUnselect(NodeUnselectEvent event) {
// put some logging here...
}
Поместите оператор println или logging в ваш метод setSelectedTreeNode
, чтобы убедиться, что установщик вызывается при нажатии на узел дерева.Используйте метод getData()
для TreeNode
, чтобы получить обратно значение данных, которое вы изначально поместили в него при создании дерева.Метод getFileStreamedContent()
будет использовать это значение для доставки правильного файла, выбранного пользователем, нажав на узел дерева.