카테고리 없음

이미지를 반환하는 Spring Controller 메서드를 어떻게 작성합니까?

기록만이살길 2021. 2. 25. 03:30
반응형

이미지를 반환하는 Spring Controller 메서드를 어떻게 작성합니까?

1. 질문(문제점):

저장소에서 이미지를 반환하는 Spring 컨트롤러 메서드를 작성하고 싶습니다. 아래는 현재 버전이지만 두 가지 문제가 있습니다.

  1. @GetMapping 주석에는 미디어 유형의 문자열 배열 인 'produces'매개 변수가 필요합니다. 해당 매개 변수가 없으면 프로그램이 작동하지 않습니다. 이미지 데이터를 텍스트로 표시합니다. 문제는 추가 미디어 유형을 지원하려면 프로그램을 다시 컴파일해야한다는 것입니다. viewImg 메서드 내부에서 'produces'미디어 유형을 설정하는 방법이 있습니까?
  2. 아래 코드는 svg를 제외한 모든 이미지 유형을 표시하며 "오류가 포함되어있어 이미지를 표시 할 수 없습니다"라는 메시지 만 표시합니다. 웹 브라우저 (Firefox)는이를 "webp"미디어 유형으로 식별합니다. 그러나 "image / svg + xml"항목을 제외하고 'produces'문자열 배열에서 모든 미디어 유형을 제거하면 이미지가 표시됩니다.

보다 일반적이고 (모든 미디어 유형에서 작동하도록) svg 미디어 유형에 문제가없는 컨트롤러 메서드를 작성하는 방법을 알려주십시오.

내 테스트 코드는 다음과 같습니다.

@GetMapping(value = "/pic/{id}",
        produces = {
                "image/bmp",
                "image/gif",
                "image/jpeg",
                "image/png",
                "image/svg+xml",
                "image/tiff",
                "image/webp"
        }
)
public @ResponseBody
byte[] viewImg(@PathVariable Long id) {

    byte[] data = new byte[0];
    String inputFile = "/path/to/image.svg";
    try {
        InputStream inputStream = new FileInputStream(inputFile);
        long fileSize = new File(inputFile).length();
        data = new byte[(int) fileSize];
        inputStream.read(data);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}

2. 해결방안:

FileSystemResource파일 내용 처리를 권장 합니다. .contentType(..)을 보내지 않으려면 시작 줄을 피할 수 있습니다 Content-Type.

@GetMapping("/pic/{id}")
public ResponseEntity<Resource> viewImg(@PathVariable Long id) throws IOException {
    String inputFile = "/path/to/image.svg";
    Path path = new File(inputFile).toPath();
    FileSystemResource resource = new FileSystemResource(path);
    return ResponseEntity.ok()
            .contentType(MediaType.parseMediaType(Files.probeContentType(path)))
            .body(resource);
}
65816695
반응형