我正在开发一个示例应用程序,用于从目录及其子目录下载日志文件。我正在为我的应用程序使用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());
}
}
}
我的担忧如下。
在我的jsp中,我能够显示主目录及其子目录下的文件名。但是只能从主目录下载文件。即 “ C:\ work \ demo-logs \”,但无法下载以下文件: 存在于嵌套目录下。例如,在 “ C:\ work \ demo-logs \ sub \”。请提出我该如何实现?
我是否需要使用除jsp之外的其他任何技术才能轻松实现 实现。我还需要显示目录名称和 子目录名称,当用户单击它时,它应该展开并 显示其下存在的文件。一旦用户单击文件名,便应下载该文件。
答案 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)