@i_yan

Как отобразить картинку в Heroku Spring Boot проекта?

После деплоя проета на Heroku не отображаются картинки, название которых хранятся в бд. На локали все работает, а в Хероку нет.
@Controller
public class TourController {
    @Autowired
    private TourRepository tourRepository;

    @GetMapping("/")
    public String mainPageShowTours(Model model) {
        model.addAttribute("tours",tourRepository.findAll());
        return "home/main";
    }
    @PostMapping("/admin/save")
    public String saveTour(@ModelAttribute(name = "tour") Tour tour,
                           @RequestParam("fileImage") MultipartFile multipartFile) throws IOException {
        String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
        tour.setImage(fileName);
        Tour savedTour = tourRepository.save(tour);
        String uploadDir = "./tour-image/" + savedTour.getId();

        Path uploadPath = Paths.get(uploadDir);
        if (!Files.exists(uploadPath)) {
            Files.createDirectories(uploadPath);
        }
        try (InputStream inputStream = multipartFile.getInputStream()) {
            Path filePath = uploadPath.resolve(fileName);

            System.out.println(filePath.toFile().getAbsolutePath());
            Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            throw new IOException("Невозможно сохранить файл: " + fileName);
        }
        return "redirect:/admin/tourList";
    }
}

Модель:
@Entity
@Table(name = "tour")
public class Tour {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "code")
    private int id;
    @Column(name = "image", nullable = true)
    private String image;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
    @Transient
    public String getImagePath() {
        if (image == null || id == 0) {
            return null;
        }
        return "/tour-image/" + id + "/" + image;
    }

<img class="card-img-top" th:src="@{${tour.imagePath}}" alt="Card image cap" width="320" height="200">

После деплоя контролле без проблем загружает в бд название картинок, но не отображает результат в списке объектов.
Что надо исправить, чтобы показывались картинки?
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Spring
Седой и строгий
Конечно, на Heroku же эфимерная файловая система, в ней не сохраняется то, что вы загружаете. Либо ищете обычный VPS вместо PaaS, либо подключайте S3 и переписывайте код работы с файлами под его использование.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы