https://www.facebook.com/annnbot/photos/a.782101778612665/782101781945998/
이미지를 불러오려고할 때 우리는 위와 같은 URL을 살펴볼 필요가 있다.
https://www.facebook.com/annnbot/photos/
이부분이 restapi controller고 생각해본다면
a.782101778612665/782101781945998/
뒤에부분은 저사진의 이름이라고 생각하면 spring에서 이미지를 업로드하고 불러오는 방법의 메커니즘이 상상이간다.
실제로는 이렇게 처리하지는 모르겠으나 이렇게 처리하면 될거같다.
파일업로드
if (file.isEmpty()) {
// file image 가 없을 경우
sb.append("none.png");
} else {
sb.append(date.getTime());
sb.append(file.getOriginalFilename());
}
feed.setSrc(sb.toString());
// 파일 업로드 끝
if (!file.isEmpty()) {
File dest = new File("C://images/feed/" + sb.toString());
try {
file.transferTo(dest);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// db에 파일 위치랑 번호 등록
}
file.taranferTo를 사용하게되면 dest의 경로로 file이 전송되게 된다. 이때 spring에서는
@RequestParam("file") MultipartFile file
태그를 이용해서 파일을 불러오면 된다.
그럼 저장된 파일과 별개로 이 이미지 이름을 db에 저장해둘때 어느 유저가 올린 image이다라는 정보를 알 수있다.
그렇게되면 image들은 폴더에 모여서 관리하게 되고 db에는 image의 속성을 알수 있게된다.
만약 어떤유저가 자신이 올리 image들을 요구하게된다면 db에서 그 유저와 관련된 모든 imageName들을 유저에 전달할 것이다. 그때는 api/image/{ } url 자체를 보내게되는데 컨트롤러에서 url 요청에대해 { } 안에있는 이미지를 반환하게 만들어주면 된다.
@GetMapping(value = "image/{imagename}", produces = MediaType.IMAGE_JPEG_VALUE)
public ResponseEntity<byte[]> userSearch(@PathVariable("imagename") String imagename) throws IOException {
System.out.println("test");
InputStream imageStream = new FileInputStream("C://images/feed/" + imagename);
// InputStream imageStream = new FileInputStream("/home/ubuntu/images/feed/" + imagename);
byte[] imageByteArray = IOUtils.toByteArray(imageStream);
imageStream.close();
return new ResponseEntity<byte[]>(imageByteArray, HttpStatus.OK);
}
다음과 같이 byte[]형식으로 반환하게 해주면 가장위에처럼 이미지만 chrom 상에서 반환되는 것을 볼 수 있다.
'Spring' 카테고리의 다른 글
@Configuration을 이용한 설정 (0) | 2020.08.09 |
---|---|
bean 이란 (0) | 2020.08.09 |
스프링 Swagger 커스텀 마이징을 해보자 (0) | 2020.07.24 |
Spring Token 만들고 검증하기 (0) | 2020.07.23 |
Spring properties 설정 (0) | 2020.07.22 |