Search code examples
javatomcatservletsjakarta-eetomcat7

JavaEE, Servlet create links to files in the folder


There is a servlet that accepts files from the client and stores them in a folder. It is now necessary to list the files from this folder and create links to them (that is, click on the file name and it's downloaded from you).

Now just output a list of files in the form of text. How to create links to them? I read that for this it is enough to expose the headers, but how this is done and has not been found. Sample Code:

public class FileListServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public FileListServlet() {
        super();
  }

    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


        String param = "/dirs";

        PrintWriter w = res.getWriter();
        res.setContentType("text/html");

        String root="/dirs";
        java.io.File dir = new java.io.File(root);

        File[] fileList = dir.listFiles();

        w.println("<H2><FONT COLOR=TEAL>" + "Total number of files in the choosen directory - " +
            fileList.length + "</FONT></H2>");
        w.println("<H3><FONT COLOR=PURPLE>" +
            "Directory path - " + param + "</FONT></H3><HR>");
        w.println("<TABLE BORDER=0 CELLSPACING=5>");

       for(int i = 0; i < fileList.length; i++)
            printName(fileList[i], w);      

        w.println("</TABLE><HR>");

      }

     private void printName(File name, PrintWriter output)
      {

        String type = name.isDirectory()
            ? " (Directory)" : " (File)";
        output.println("<TR><TD>" + type + "</TD><TD><FONT COLOR=BLUE>"
            + name.getName()  + "</FONT></TD></TR>");

      }

      public String getServletInfo()
      {
        return "This servlet shows a content of a directory" +
               "mentioned in dirToShow parameter or property.";
      }
}

enter image description here


Solution

  • I solved my problem. In case someone needs it or someone knows a more beautiful way.

    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class FileListServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public FileListServlet() {
            super();
      }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            PrintWriter printWriter = response.getWriter();
            response.setContentType("text/html");
    
            File currentFolder = new File(".");
            File workingFolder = new File(currentFolder, "Sorted files");
    
            String root = workingFolder.getAbsolutePath();
            java.io.File dir = new java.io.File(root);
    
            File[] fileList = dir.listFiles();
    
            printWriter.println("<H2><FONT COLOR=TEAL>" + "Total number of files in the choosen directory - " +
                fileList.length + "</FONT></H2>");
            printWriter.println("<H3><FONT COLOR=PURPLE>" +
                "Directory path - " + root + "</FONT></H3><HR>");
            printWriter.println("<TABLE BORDER=0 CELLSPACING=5>");
    
    
    
            for(int i = 0; i < fileList.length; i++) {
                printName(fileList[i], printWriter);      
            }
            printWriter.println("</TABLE><HR>");
    
          }
    
         private void printName(File file, PrintWriter output)
          {
    
             System.out.println(file.getName());
    
            output.println("<tr><td><a href=\"https://Upload/DownloadServlet?name="
                    +file.getName()+"\">" + file.getName() + "</a></td></tr>" );
    
          }
    
          public String getServletInfo()
          {
            return "This servlet shows a content of a directory" +
                   "mentioned in dirToShow parameter or property.";
          }
    }
    

    And DownloadServlet

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class DownloadServlet
     */
    public class DownloadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /**
         * @see HttpServlet#HttpServlet()
         */
        public DownloadServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            String name = request.getParameter("name");
    
            String fileType = "multipart/form-data";
    
            response.setContentType(fileType);
    
            response.setHeader("Content-disposition", "attachment; filename=" + name);
    
            File currentFolder = new File(".");
            File workingFolder = new File(currentFolder, "Sorted files");
    
            String root = workingFolder.getAbsolutePath();
    
            File file = new File(root + File.separator + name);
    
            OutputStream output = response.getOutputStream();
            FileInputStream input = new FileInputStream(file);
    
            byte[] buffer = new byte[4096];
            int lenght;
    
            while( ( lenght = input.read(buffer) ) > 0 ) {
                output.write(buffer, 0, lenght);
            }
    
            input.close();
    
            output.flush();
            output.close();
    
            response.getOutputStream().flush();
            response.getOutputStream().close();
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }