Загрузка файлов из каталога и подкаталога - Использование Java, JSP - PullRequest
0 голосов
/ 10 октября 2018

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

вы можете использовать Files.walk, чтобы упростить процесс.он имеет глубину аргумента, так что вы можете указать уровень глубины для подкаталогов.

сначала создайте объект пути.

Path file_path = Paths.get ("/ home / User / mypath");

, затем перечислите каталоги с подкаталогами

public Stream<Path> loadFiles() {
    try {
        return Files.walk(file_path, 1)
    }
    catch (IOException e) {
        throw new RuntimeException("\"Failed to read stored file");
    }
}

, вы можете изменить глубину как Files.walk (file_path, 2) и, если хотите, можете отфильтровать файлы икаталоги как

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...