2011-11-08 29 views
1

私は、dirとファイルのリストを表示するツリー(tree2 tomahawk 1.1.11)を持っています。ファイルをクリックすると、ダウンロードダイアログが表示され、クライアントがファイルをダウンロードできるようになります。マイページはcommandLinkとTree2を使ってtxtまたはcsvファイルを表示/ダウンロードするJSF

... 
    <h:form> 
     <t:tree2 id="tree" value="#{listFiles.treeData}" 
       var="node" varNodeToggler="t" > 
      <f:facet name="folder"> 
       <h:panelGroup> 
        <f:facet name="expand"> 
         <t:graphicImage value="images/folderOpen.png" 
             rendered="#{t.nodeExpanded}}" 
             border="0" /> 
        </f:facet> 
        <f:facet name="collapse"> 
         <t:graphicImage value="images/folderClose.png" 
             rendere="#{t.nodeExpanded}}" 
             border="0" /> 
        </f:facet> 
        <h:outputText value="#{node.description}" 
            styleClass="nodeFolder" /> 
       </h:panelGroup> 
      </f:facet> 
      <f:facet name="file"> 
       <h:panelGroup> 
        <h:commandLink action="#{listFiles.download()}" > 
         <t:graphicImage value="images/file.png" border="0" /> 
         <h:outputText value="#{node.description}" /> 
        </h:commandLink> 
       </h:panelGroup> 
      </f:facet> 
     </t:tree2> 
    </h:form> 
    ... 

のように見え、私のBeanは

@ManagedBean 
@RequestScoped 
public class ListFiles implements Serializable { 

    private String path = "C:\\"; 
    private TreeNode treeRoot; 
    private File dirRoot; 
    @ManagedProperty("#{userVerifier}") 
    private UserVerifier userVerifier; 

    public void setUserVerifier(UserVerifier userVerifier) { 
     this.userVerifier = userVerifier; 
    } 

    public UserVerifier getUserVerifier() { 
     return userVerifier; 
    } 

    public TreeNode getTreeData() { 
     path = loadConfiguredPath(); 
     String dependencia = userVerifier.getDependencia(); 

     if (dependencia.equals("DESARROLLO")) { 
      path = path + "dataFiles"; 
      treeRoot = new TreeNodeBase("folder", "SRC", false); 
     } else { 
      path = path + "dataFiles\\" + dependencia; 
      treeRoot = new TreeNodeBase("folder", dependencia, false); 
     } 

     dirRoot = new File(path); 
     createTree(dirRoot, treeRoot); 

     return treeRoot; 
    } 

    private void createTree(File fileRoot, TreeNode treeRoot) { 
     File[] files = fileRoot.listFiles(); 
     TreeNodeBase tnb; 
     for (File f : files) { 
      if (f.isDirectory()) { 
       tnb = new TreeNodeBase("folder", f.getName(), false); 
       treeRoot.getChildren().add(tnb); 
       createTree(f, tnb); 
      } 
      if (f.isFile()) { 
       tnb = new TreeNodeBase("file", f.getName(), false); 
       treeRoot.getChildren().add(tnb); 
      } 
     } 
     return; 
    } 

    private String loadConfiguredPath() { 
     String dir; 
     ReadXML reader = new ReadXML(".\\webapps\\SRC\\configFiles\\confSRC.xml"); 
     dir = reader.getValue("baseDir"); 
     if (dir == null) { 
      return path; 
     } else { 
      return dir; 
     } 
    } 

    public String download(){ 
     System.out.println("Yes we are downloading"); 
     return "ok"; 
    } 
} 

私は時間をクリックすると、ダウンロード作用を達成する方法がわからない除いてすべてが正常に動作している:のcommandLink

私が持っている唯一のタイプのファイルはtxtかcsvです。

UPDATE:私は、コードを持っているように今、この例外がスローされ

javax.servlet.ServletException 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:422) 
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349) 

UPDATE:

私は

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 

    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 

    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 

    <filter> 
     <filter-name>MyFacesExtensionsFilter</filter-name> 
     <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class> 

     <init-param> 
      <param-name>uploadMaxFileSize</param-name> 
      <param-value>5g</param-value> 
     </init-param> 
     <init-param> 
      <param-name>uploadThresholdSize</param-name> 
      <param-value>500m</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>MyFacesExtensionsFilter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>MyFacesExtensionsFilter</filter-name> 
     <servlet-name>/faces/*</servlet-name> 
    </filter-mapping> 

    <context-param> 
     <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name> 
     <param-value>false</param-value> 
    </context-param> 

</web-app> 

答えて

1

私のweb.xmlを投稿します。基本的には、そのよう値として周りの物理的Fileまたは少なくともFile#getAbsolutePath()に合格する必要があるだろうダウンロードアクションメソッドはディスクからそれを読み取ることができます。私は<t:tree2>を使用したことがないので、JavadocをTreeNodeBaseにチェックし、ノード値としてString description以外のものをサポートしていないようです。 Fileで設定することはできません。だからあなたは本当にそれにFile#getAbsolutePath()を渡す必要があります。次のようにそれをストリーム、最後に

<h:commandLink action="#{listFiles.download(node.identifier)}" > 

:ちょうどアクションメソッドに渡し、ビューで、その後

tnb = new TreeNodeBase("file", f.getName(), f.getAbsolutePath(), false); 

:私はあなたがこのためにString identifier引数を使用することができると思う

public String download(String absolutePath) throws IOException { 
    File file = new File(absolutePath); 
    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); 
    } finally { 
     IOUtils.closeQuietly(output); 
     IOUtils.closeQuietly(input); 
    } 

    facesContext.responseComplete(); 
} 
+0

'javax.servlet.ServletException \t javax.faces.webapp.FacesServlet.service(FacesServlet.java:422) \t org.apache .myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349) 'この例外はまだあります。私はそれがweb.xmlのExtensionFilter設定と関係していると思う。 – BRabbit27

+0

これはありそうもない。根本原因は何ですか?さらにトレースを見てください。 – BalusC

+0

のjava.lang.NullPointerException \t javax.faces.component.UIComponentBase $ FacetsMap.put(UIComponentBase.java:2923) \t javax.faces.component.UIComponentBase $ FacetsMap.put(UIComponentBase.java:2895) \tコム。 sun.faces.application.view.StateManagementStrategyImpl $ 4.visit(StateManagementStrategyImpl.java:344) \t com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151) \t javax.faces.component.UIComponent (UIComponent.java:1589) \t isitTree(UIForm。java:344) – BRabbit27

関連する問題