Не удается подтянуть изображение с запущенного в контейнере Java Spring веб-сервиса

Рейтинг: 0Ответов: 1Опубликовано: 10.05.2023

Имеется веб-сервис, написанный на Java Spring

При GET запросе не тянется изображение, отдает 404 not found: GET http://192.168.48.3:8080/data/images/1.jpg

Где указанный адрес - адрес контейнера. Внутри контейнера /data/images/1.jpg существует

Хотя при выполнении POST запроса сервер сохраняет в папку /data/images/ файл и копирует его на смонтированную папку на хосте /data/images/

Почему он может отдавать 404? Каких настроек мне может не хватать? К тому же, если курлить внутри контейнера с сервисом данную ссылку, то так же отдает 404

Код java-контроллера:

@RestController
@RequestMapping("/images")
public class ImageController {

    @Autowired
    private ImageRepository imageRepository;

    @Autowired
    private HttpServletRequest request;

    @PostMapping("/add")
    public ResponseEntity<Object> addImage(@RequestParam("image_name") String name,
                                          @RequestParam("image_tags") String tags,
                                          @RequestParam("image_file") MultipartFile file) throws IOException {

        String uploadsDir = "/data/images/"; 

        System.out.println(file.getOriginalFilename());
        String fileName = file.getOriginalFilename();
        Path path = Paths.get(uploadsDir + fileName);
        Files.write(path, file.getBytes());


        String[] tagList = tags.split(",").clone();
        String imageUrl = "/data/images/" + file.getOriginalFilename();

        MyImage myImage = new MyImage(name, tagList, imageUrl, false);

        MyImage savedImage = imageRepository.save(myImage);

        String message = "Успешно добавлено";
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json");
        return ResponseEntity.ok()
                .headers(headers)
                .body("{\"message\":\"" + message + "\"}");
    }


    @GetMapping("/search")
    public ResponseEntity<Object> search(@RequestParam("keyword") String keyword) {
        System.out.println(keyword);
        try {
            List<MyImage> imageList = imageRepository.findByQuery(keyword);
            System.out.println(imageList.get(0).getImageUrl());
            return ResponseEntity.ok(imageList);
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

}

Dockerfile:

FROM openjdk:17-jdk-alpine
COPY target/project-0.0.1.jar /app/project-0.0.1.jar
RUN apk add --no-cache curl
WORKDIR /app
ENTRYPOINT ["java", "-jar", "project-0.0.1.jar"]

docker-compose:

version: '3'
services:
  project:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    volumes:
      - /data/images:/data/images
    restart: unless-stopped
  postgres:
    image: postgres:13.1
    container_name: postgres
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: postgres
    volumes:
      - /data/postgresql:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

Ответы

▲ 0Принят

404 значит, что у вас нет конечной точки с адресом http://192.168.48.3:8080/data/images/ А для того, чтобы вы могли получить фото необходимо создать endpoint например так:

Ваш контроллер:

@RequestMapping("/data")
public class ImageController {

    PhotoStorageRepository storageRepository;

    @GetMapping("/images/{image_file_name}")
    public ResponseEntity<?> getImage(
            @PathVariable(value = "image_file_name") String imageFileName
    ) throws FileNotFoundException {
        ImageDto imageDto = storageRepository.getFile(imageFileName);
        return ResponseEntity
                .status(HttpStatus.OK)        
                .contentType(MediaType.parseMediaType(
                     imageDTO.getContentType()))
                .body(imageDTO.getImage());
    }
}

Метод репозитория может выглядеть так:


public ImageDTO getFile(String imageFileName) throws FileNotFoundException {
        try {
            Path pathToFile = Path.of(filePath + "/" + imageFileName);
            byte[] imageByteArray = Files.readAllBytes(pathToFile);
            String imageContentType = Files.probeContentType(pathToFile);
            return new ImageDto(imageContentType, imageByteArray);
        } catch (IOException e) {
            String message = String.format("File with name: %s does not exist", imageFileName);
            throw new FileNotFoundException(message);
        }
    }

И пример ImageDto

public class ImageDTO {

    @JsonProperty(value = "content_type")
    String contentType;

    byte[] image;

}