복붙노트

[SPRING] 스프링 부트 이미지 업로드 및 검색

SPRING

스프링 부트 이미지 업로드 및 검색

나는 새로운 Spring Boot 응용 프로그램을 만들고 있으며 이미지를 저장하고 제공 할 수 있기를 원한다. 이미지를 응용 프로그램 디렉토리에 저장하고 싶다. 이리

이것은 지금 업로드가 어떻게 생겼는지입니다.

@PostMapping("/")
@ResponseBody
public String upload(@RequestPart String title, @RequestPart MultipartFile img) throws IOException{
    String imgName = img.getOriginalFilename();
    Post p = new Post();
    p.setTitle(title);
    p.setImageName(imgName);
    postService.add(p);
    File upl = new File("images/" + imgName);
    upl.createNewFile();
    FileOutputStream fout = new FileOutputStream(upl);
    fout.write(img.getBytes());
    fout.close();
    return "ok";
}

이게 내가 이미지를 얻는 방법이다.

<img th:src="@{'images/' + ${post.imageName}}"/>

지금 나는 404를 얻고 나가 디렉토리에있는 몇몇 심상을보고 싶을 때 나는 얻는다

Fatal error reading PNG image file: Not a PNG file

작동 시키려면 어떻게해야합니까?

해결법

  1. ==============================

    1.기본적으로 Spring Boot 애플리케이션은 다음 위치에있는 정적 이미지 (사례 이미지 포함)를 제공합니다.

    기본적으로 Spring Boot 애플리케이션은 다음 위치에있는 정적 이미지 (사례 이미지 포함)를 제공합니다.

    따라서 일반적으로 정적 / 이미지 /는 아마도 Thymeleaf가 렌더링을 위해 전달되어야하는 정적 이미지를 예상해야하는 곳일 것입니다. 그러나이 장소는 정적 인 내용에 관한 것이므로 일반적으로 업로드 된 (동적 인) 내용을 응용 프로그램 내에 저장하는 것은 좋지 않으므로 그렇게하지 않는 것이 좋습니다. 응용 프로그램을 다른 컴퓨터로 재배포하거나 옮기면 어떻게 될지 생각 했습니까? 귀찮은 방식으로 이미지를 백업 / 이동해야합니다. 더 나은 솔루션이 있습니다. 앱 외부의 별도 위치에 업로드 콘텐츠를 저장하거나 (예 : 구성 가능하고 여러 인스턴스에서 다시 사용할 수 있음) 이미지 데이터를 저장하기 위해 데이터베이스를 사용할 수도 있습니다. 또한 트랜잭션 컨텍스트 (예 : 분리 및 롤백)에서 이미지를 처리 ​​할 수 ​​있습니다.

    하지만 이제 앱 안에 앱을 저장하려는 경우 검색 할 장소 (실제로 정적 인 콘텐츠)를 추가하여 위치를 확장 할 수 있습니다. Ajit의 대답과 설명서조차도 여전히 자신의 WebMvcConfigurerAdapter를 확장하는 조언을 제공하지만 개인적으로 WebMvcConfigurer를 구현하는 경향이 있습니다.

    이 경우 다음과 같이 표시됩니다.

    @Configuration
    public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(final ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
        }
    }
    
  2. ==============================

    2.이미지 폴더의 이미지에 액세스하려면,

    이미지 폴더의 이미지에 액세스하려면,

    다음과 같이 WebMvcConfigurerAdapter 클래스의 addResourceHandlers 메소드를 재정의해야합니다.

    @Configuration
    public class ResourceConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
        }
    }
    

    그 후에 URL에 다음과 같은 이미지를 추가 /

    <img th:src="@{'/images/' + ${post.imageName}}"/>
    
  3. ==============================

    3.jar 파일과 같은 디렉토리에 / static 폴더에 외부 파일을 저장할 수 있으며, spring은 기본적으로 그 파일을 검사합니다. 따라서 정적 / 이미지가 있거나 다음을 사용하여 이미지를 참조 할 수 있습니다.

    jar 파일과 같은 디렉토리에 / static 폴더에 외부 파일을 저장할 수 있으며, spring은 기본적으로 그 파일을 검사합니다. 따라서 정적 / 이미지가 있거나 다음을 사용하여 이미지를 참조 할 수 있습니다.

    따라서 새로운 파일 ( "/ static / images /"+ imgName)을 사용하고자합니다.

  4. from https://stackoverflow.com/questions/45651119/spring-boot-images-uploading-and-serving by cc-by-sa and MIT license