Изображение не загружается до перезапуска приложения

После загрузки изображения в локацию dataBaseTest\src\main\resources\static\uploads\ я не могу отобразить его на веб-странице, пока приложение не будет перезапущено. Я знаю, что это потому, что папка static загружается только при запуске сервера, но как это решить? Я пытался загрузить изображение напрямую в \dataBaseTest\target\classes\static\uploads\, и оно работает нормально (загружается сразу после загрузки), но это не совсем правильно. Также я попытался добавить

<configuration>
    <addResources>true</addResources>
</configuration>

на "pom.xml", но ничего не изменилось.

Я также пытался использовать addResourceHandlers, но вся папка static, кажется, перестала работать.

Я использую Spring Boot dev Tools, поэтому приложение перезапускается автоматически, но я пытаюсь решить эту проблему без перезапуска.

~ изменить

код ошибки

~ редактировать 2

Я запускаю это приложение в Intellij Tomcat.

это мой FileUploadService

public String uploadImage(MultipartFile multipartFile) throws IOException {


    String fileName = multipartFile.getOriginalFilename();
    Path uploadDirectory = Paths.get("src/main/resources/static/uploads/");
    //Path uploadDirectory = Paths.get("target\\classes\\static\\uploads\\");


    try (InputStream inputStream = multipartFile.getInputStream()) {
        String path = UUID.randomUUID()+ "-" + fileName;
        Path filePath = uploadDirectory.resolve(path);
        Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
        return path;
    } catch (IOException ioException){
        throw new IOException("Error saving uploaded file: " + fileName, ioException);
    }
}

это контроллер

public String displayArticles(Model model){
    final String currentName = SecurityContextHolder.getContext().getAuthentication().getName();
    System.out.println(currentName);
    model.addAttribute("currentUser", currentName);
    model.addAttribute("articles", repoArticle.findAll());
    model.addAttribute("comments", commentService.findAll());
    model.addAttribute("likes", repoLikes.findByUsername(currentName));
    return "display_articles";
}

это HTML

            <div class = "image">
                <img th:src = "'../uploads/' + ${article.path}" alt = "">
            </div>

дерево папок

вы, безусловно, можете отобразить свое изображение без перезапуска приложения. Вы должны делать что-то не так. Что происходит, когда вы пытаетесь отобразить свое изображение? Разве это не показывает? Какой код состояния http вы видите на вкладке «Сеть»?

dsp_user 08.02.2023 20:47

Я проверял несколько раз, и это всегда 404 до перезагрузки. После перезагрузки он автоматически копируется в папку target, поэтому работает. Но, к сожалению, я не знаю, как пропустить эту часть.

aryszkij 09.02.2023 00:11

вы запускаете свое приложение из IDE или оно развернуто на сервере? Я вижу по этому изображению, что вы получаете 404 для ресурса json, а не jpeg? Вы не опубликовали никакого кода, поэтому мы можем только догадываться, почему это происходит.

dsp_user 09.02.2023 08:30

~ Обновляю пост еще раз. Да, в коде ошибка json-ресурса, и я не знаю почему, но после перезагрузки появляется обычный код 200 с файлом jpg.

aryszkij 09.02.2023 12:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно сохранить ваше изображение непосредственно в папку /target и, таким образом, сделать его немедленно доступным (обратите внимание, что и ресурсы приложения, и код хранятся в /target, когда приложение запущено).

    //use the class loader to get the resource path, rather than hardcoding it
    final String uploadLocation = getClass().getClassLoader().getResource("static/uploads").toString();
    //we should get rid of file:/, hence the substring
    final Path uploadDirectory = Paths.get(uploadLocation.substring(6, uploadLocation.length()) );

Остальной код может остаться прежним.

Кроме того, вы можете указать собственную папку для загрузки. Например,

приложение.свойства

 #user home should be present on any computer
 files.upload.location=${user.home}/myApp/fileUpload

Затем вы просто получите его в своем контроллере,

 @Autowired 
 private Environment environment;
...

final String uploadLocation =    environment.getProperty("files.upload.location");

Надеюсь это поможет.

Другие вопросы по теме