Я разрабатываю пример приложения для загрузки файлов журнала из каталога и его подкаталога.Я использую технологии 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, для простоты реализации.Мне также нужно показать имя каталога и имя подкаталога, и когда пользователь нажимает на него, он должен развернуться и показать файлы, находящиеся под ним. Как только пользователь нажимает на имя файла, он должен получить загрузку.