Список файлов из каталога шаблонов в Spring Boot - PullRequest
1 голос
/ 28 марта 2019

Я хотел бы создать обзор постов в блоге.Для этого я хочу прочитать html-файлы из папки внутри папки шаблонов в папке ресурсов, где Spring Boot хранит свои шаблоны.

Я пробовал это, но он не возвращает ошибку, но также не выводит список файлов.

Как пройти сюда?

Спасибо

@Controller
public class Route {

    @Autowired
    private ResourceLoader resourceLoader;

    @RequestMapping("/")
    public String home() throws IOException {
        final String path = "templates/blog";
        final Resource res = resourceLoader.getResource("templates/blog");
        try (final BufferedReader reader = new BufferedReader(new InputStreamReader(res.getInputStream()))) {
            reader.lines().forEachOrdered(System.out::println);
        }
        return "blog/a";
    }
}

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
@Controller
public class Route {

    @Value("classpath:templates/blog/*")
    private Resource[] resources;

    @RequestMapping("/")
    public String home() throws IOException {
        for (final Resource res : resources) {
            System.out.println(res.getFilename());
        }
        return "blog/a";
    }
}

сделал мне трюк.

0 голосов
/ 28 марта 2019

Этого можно добиться, используя NIO2 .

Для работы NIO2 требуется концепция FileSystem , которая может быть создана из URI jar. Затем эту файловую систему можно использовать с файлами / путями. Код ниже содержит две ветви - первая обрабатывает загрузку файлов изнутри Jar , вторая ветвь - когда код запускается из IDE или через "mvn spring-boot:run".

Все потоки используются через try-with-resources , поэтому они будут автоматически закрываться.

Функция поиска запускается сверху файловой системы и рекурсивно ищет html-файлы.

public static void readFile(String location) throws URISyntaxException {
        URI uri = Objects.requireNonNull(ReadFromJar.class.getClassLoader().getResource(location)).toURI();
        if (uri.getScheme().equals("jar")) {  //inside jar
            try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) { //build a new FS that represents the jar's contents
                Files.find(fs.getPath("/"), 10, (path, fileAttr) -> // control the search depth (e.g. 10)
                        fileAttr.isRegularFile() //match only files
                                && path.toString().contains("blog") //match only files in paths containing "blog"
                                && path.getFileName().toString().matches(".*\\.html")) // match only html files
                        .forEach(ReadFromJar::printFileContent);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        else { //from IDE or spring-boot:run
            final Path path = Paths.get(uri);
            try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(path)) {
                dirStream.forEach(ReadFromJar::printFileContent);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void printFileContent(final Path file) {
        try {
            System.out.println("Full path: " + file.toAbsolutePath().toString());
            Files.lines(file).forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
...