После загрузки изображения в локацию 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>
Я проверял несколько раз, и это всегда 404 до перезагрузки. После перезагрузки он автоматически копируется в папку target
, поэтому работает. Но, к сожалению, я не знаю, как пропустить эту часть.
вы запускаете свое приложение из IDE или оно развернуто на сервере? Я вижу по этому изображению, что вы получаете 404 для ресурса json, а не jpeg? Вы не опубликовали никакого кода, поэтому мы можем только догадываться, почему это происходит.
~ Обновляю пост еще раз. Да, в коде ошибка json-ресурса, и я не знаю почему, но после перезагрузки появляется обычный код 200 с файлом jpg.
Это должно сохранить ваше изображение непосредственно в папку /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");
Надеюсь это поможет.
вы, безусловно, можете отобразить свое изображение без перезапуска приложения. Вы должны делать что-то не так. Что происходит, когда вы пытаетесь отобразить свое изображение? Разве это не показывает? Какой код состояния http вы видите на вкладке «Сеть»?