从目录和子目录下载文件-使用Java,JSP

时间:2018-10-10 17:16:48

标签: java jsp spring-boot jstl

我正在开发一个示例应用程序,用于从目录及其子目录下载日志文件。我正在为我的应用程序使用Spring Boot和jsp技术。

下面提到的ReviewController类负责列出指定目录(即EXTERNAL_FILE_PATH及其子目录)中的所有文件,并将相同的列表发送到review.jsp页面。

@Controller
public class ReviewController {

    private static final String EXTERNAL_FILE_PATH = "C:\\work\\demo-logs\\";


    @RequestMapping("/review")
    public ModelAndView reviewPage() {
        String root=EXTERNAL_FILE_PATH;
        java.io.File file;
        java.io.File dir = new java.io.File(root);
        List<String> list = new ArrayList<String>();
        List<String> fileList =displayDirectoryContents(dir,list);
        ModelAndView model = new ModelAndView("review");
        model.addObject("lists", fileList);
        return model;


    }

    public List<String> displayDirectoryContents(File dir,List<String> list) {

        try {
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    System.out.println("directory:" + file.getName());

                    displayDirectoryContents(file,list);
                } else {
                    System.out.println("     file:" + file.getName());
                    list.add(file.getName());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

}

我的review.jsp代码如下所示。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>Logs Monitoring App</h1>

    </br>
    </br>

    </br>
    <c:if test="${not empty lists}">

        <ul>
            <c:forEach var="listValue" items="${lists}">

                <li><a href='/download/file/<c:out value="${listValue}"  />'>${listValue}</a>
            </c:forEach>
        </ul>

    </c:if>
</body>
</html>

在上面的jsp中,我正在迭代列表并将文件名显示为超链接。

我还有一个控制器,当用户单击jsp中的链接时,该控制器负责下载文件。下面是相同的代码

@RestController
@RequestMapping("/download")
public class LogFileDownloadController {

    private static final String EXTERNAL_FILE_PATH = "C:\\work\\demo-logs\\";

    @RequestMapping("/file/{fileName:.+}")
    public void downloadPDFResource(HttpServletRequest request, HttpServletResponse response,
            @PathVariable("fileName") String fileName) throws IOException {

        File file = new File(EXTERNAL_FILE_PATH + fileName);

        if (file.exists()) {


            String mimeType = URLConnection.guessContentTypeFromName(file.getName());
            if (mimeType == null) {

                mimeType = "application/octet-stream";
            }

            response.setContentType(mimeType);




            response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() + "\""));
response.setContentLength((int) file.length());

            InputStream inputStream = new BufferedInputStream(new FileInputStream(file));

            FileCopyUtils.copy(inputStream, response.getOutputStream());

        }
    }

}

我的担忧如下。

  1. 在我的jsp中,我能够显示主目录及其子目录下的文件名。但是只能从主目录下载文件。即 “ C:\ work \ demo-logs \”,但无法下载以下文件: 存在于嵌套目录下。例如,在 “ C:\ work \ demo-logs \ sub \”。请提出我该如何实现?

  2. 我是否需要使用除jsp之外的其他任何技术才能轻松实现 实现。我还需要显示目录名称和 子目录名称,当用户单击它时,它应该展开并 显示其下存在的文件。一旦用户单击文件名,便应下载该文件。

1 个答案:

答案 0 :(得分:1)

您可以使用Files.walk使其变得更容易。它在参数中具有深度,因此您可以指定子目录的深度级别。

首先创建一个路径对象。

路径file_path = Paths.get(“ / home / User / mypath”);

然后列出包含子目录的目录

.circle {
  width: 30px;
  height: 30px;
  background: #fc4;
  display: block;
  border-radius: 30px;
  transform: translateX(0);
  transform-origin: center;
  transition: .1s ease-in-out;
}

您可以将深度更改为Files.walk(file_path,2) 如果您愿意,可以将文件和目录过滤为

Files.walk(file_path,1).filter(Files :: isRegularFile)