How can I list all the files in folder on tomcat?
Asked Answered
T

7

36

I have got a folder with many excel documents in it on tomcat and i want those files to be available when i got go the that folder's url in the browser (eg http;//localhost:8080/myfolder)

at the moment when i try to access a folder i get a 404 error. by if i try to access a file that is in that folder, it works.

Tarshatarshish answered 15/8, 2011 at 17:1 Comment(7)
post up the code you are using. Also, make sure you don't take user input here or you may reveal /etc/shadowKerman
it looks like an htaccess permission problem.Confederation
@Kerman there is no code. it's just a folder with some files in it. i want to be able to navigate to that folder's url and have it display all the files in it just like apache server does.Tarshatarshish
@user if there is no code then why did you mark it as java and jsp?Kerman
Modified the tags as I think those are slightly more useful than the java and jsp tags you hadKerman
@nos I've editted the original post to include the web-inf fileTarshatarshish
Don't pay attention to comment of nos. It's not related to the problem.Cardio
C
56

The DefaultServlet of Tomcat is by default configured to not show directory listings. You need to open Tomcat's own /conf/web.xml file (look in Tomcat installation folder), search the <servlet> entry of the DefaultServlet and then change its listings initialization parameter from

<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>

to

<init-param>
    <param-name>listings</param-name>
    <param-value>true</param-value>
</init-param>

Keep in mind that this affects all folders of your webapp. If you want to enable this for only an individual folder, you've got to write some Servlet code yourself which does the job with help of the java.io.File API in servlet side to collect the files and some bunch of HTML/CSS in JSP side to present it in a neat fashion.

Cardio answered 15/8, 2011 at 17:12 Comment(7)
I have added the web-inf file to the original post. can you tell me where abouts those paramaters should go. thanksTarshatarshish
@Solver: the other answer is not portable (i.e. webapp will crash when deployed to a server of a different make and possibly even different version). You see, it's not part of standard Servlet API.Cardio
This can be done on a per-webapp basis. You just have to modify the application's WEB-INF/web.xml instead of Tomcat's site-wide conf/web.xml. You will need to copy the whole DefaultServlet declaration, setup, and mapping into your own WEB-INF/web.xml but once you do that, you can enable directory-listings for a single web application instead of all web applications deployed on that Tomcat instance.Cyrano
@Christopher: it's not portable, see previous comment.Cardio
@Cardio Sure it's not portable, but neither are directory listings themselves. The servlet spec does not guarantee that requests for directories with no welcome-file present will instead show a directory listing. So discussing directory-listings provided by the container are already out of spec, and thus not portable.Cyrano
@Christopher: The main concern is that the webapp will crash when deployed to other server, not that directory listings are not configurable via Servlet API. Just configure them in the individual server itself. This way you don't need to change and rebuild the webapp for every different server the world is aware of.Cardio
A little late but, this is a very bad idea. We should be reading the files using Java IO and then sending the content over API, possibly paginated.I
P
19

You can also enable it starting from a given url pattern. Just add the servlet and servlet-mapping to you app web.xml

<servlet>
    <!-- List files in /ws-definitions -->
    <servlet-name>ListWsDefinitions</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>ListWsDefinitions</servlet-name>
    <url-pattern>/ws-definitions/*</url-pattern>
</servlet-mapping>

In this example directories below "/ws-definitions/" will be listen.

Payment answered 2/7, 2013 at 12:52 Comment(2)
I tried this to access the files list using tomcat and it worked well. Thank you!Blackfish
Nope, such a webapp would crash when deployed to a different server make/version. In other words, such a webapp is not portable. Rather configure it in server end instead of webapp end. Or, homegrow your own reusable directory listings servlet.Cardio
B
6

Here's some documentation explaining how to do this.

http://tomcat.apache.org/tomcat-7.0-doc/default-servlet.html

The basic idea is to change the value of listings parameter to true in the main web.xml of tomcat.

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>
      org.apache.catalina.servlets.DefaultServlet
    </servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

But the above will expose all directories. In order to have fine control, follow the steps explained here:

http://tomcat.apache.org/tomcat-7.0-doc/default-servlet.html#dir

Belligerence answered 15/8, 2011 at 17:6 Comment(1)
I did not downvote, but your initial answer only told how to customize the default directory listing layout, not how to enable it.Cardio
A
3

If you are using Tomcat 6 (which implements Servlet 2.5 specification) or a newer version, you don't have to change the web.xml in the CATALINA_HOME/conf/ directory to display the directory listings. Instead you should change the web application's own web.xml file under WEB-INF.

As Adarshr mentioned, this is what you need to add to the web.xml

<servlet>
  <servlet—name>default</servlet—name>
  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  <init-param>
    <param-name>debug</param-name>
    <param-value>0</param-value>
  </init-param>
  <init-param>
    <param-name>listings</param-name>
    <param-value>true</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>

You also need to add the following

<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>/</url-pattern>
</servlet-mapping>
Ardell answered 2/9, 2013 at 2:43 Comment(0)
D
2

Here's a simple servlet that might be a start for a completely custom approach.

Dumond answered 15/8, 2011 at 17:13 Comment(0)
M
2

If changing the listings param value doesn't work, try editing the welcome file list

default values were the following:

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

edit it as follows:

<welcome-file-list>
    <welcome-file></welcome-file>
    <welcome-file></welcome-file>
    <welcome-file></welcome-file>
</welcome-file-list>

on removing them it should work perfectly

Metonymy answered 29/7, 2013 at 8:45 Comment(0)
S
0

If you are just trying to implement a web-based file browser for files outside of your servlet, you could use the custom webapp mentioned in this answer.

Scheers answered 9/2, 2014 at 3:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.