Framework/Spring Framework

(23.01.13)Spring ํ”„๋ ˆ์ž„์›Œํฌ : ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๊ธฐ(์ด๋ฏธ์ง€ ํƒœ๊ทธ, Thymeleaf์—์„œ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ)

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2023. 1. 16.

์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๊ธฐ

โ€‹

-WEB-INF ์•„๋ž˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€(WEB-INF/files/)

-์„œ๋ฒ„์ธก์—์„œ WEB-INF ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์ „ํ•ด์ค„ ์ˆ˜๋Š” ์žˆ์Œ

-<img src="/image/mypic.jpg">

-์œ„์˜ ํƒœ๊ทธ๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋“œ๋˜๋ฉด ์›น๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ฒŒ ๋จ

-์œ„์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ๋•Œ ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋จ

-์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” @ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ byte[ ]์ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฆฌํ„ด๋˜๋„๋ก ํ•จ

-์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ <img src='xxxx'> ํƒœ๊ทธ๋Š” ์ด๋ฏธ์ง€๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Œ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.InputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import lombok.extern.slf4j.Slf4j;
 
@Slf4j
@Controller
@RequestMapping("/image")
public class ImageController 
{
   @Autowired
   private ResourceLoader resourceLoader;//spring์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ResourceLoader : ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ resource๋ผ๊ณ ํ•œ๋‹ค.
   
   @GetMapping("/test")
   public String showImage()
   {
      return "thymeleaf/showImage";
   }
   
   @GetMapping(value="/{filename}", produces=MediaType.IMAGE_JPEG_VALUE)
   @ResponseBody
   public byte[] getImage(@PathVariable String filename)
   {
      try {
         Resource resource = resourceLoader.getResource("WEB-INF/files/"+filename);     
         //Resource ๊ฐ์ฒด๋Š” ํŒŒ์ผ์˜ ๋ชจ๋“  ์ •๋ณด(ํŒŒ์ผ ์ด๋ฆ„, ์‚ฌ์ด์ฆˆ, ๊ฒฝ๋กœ ๋“ฑ๋“ฑ)๋ฅผ ๊ฐ€์ ธ์™€ ๋‹ด๋Š”๋‹ค.
         InputStream in = resource.getInputStream();
         int len = (int)resource.getFile().length(); //ํŒŒ์ผ์˜ ์ „์ฒด ํฌ๊ธฐ๊ฐ€ longํ˜•์œผ๋กœ ๋‚˜์˜ค์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ image size๋Š” int๋กœ ๋˜์–ด ์žˆ์–ด์„œ int๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
         log.info("ํŒŒ์ผ ํฌ๊ธฐ={}, available={}", len, in.available());
 
         byte[] buf = new byte[len];  //ํŒŒ์ผ ์ „์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณด
         in.read(buf, 0, len);  //"in"์ด ์ฝ์–ด์˜จ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋นˆ byte array "buf"์— ๋‹ด๋Š”๋‹ค.
         //์ด ๋ฒ„ํผ์˜ ์ฒ˜์Œ(0)๋ถ€ํ„ฐ len๋งŒํผ๊นŒ์ง€์— ๋‹ด๊ธธ ๋งŒํผ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ด๊ฒŒ๋œ๋‹ค.
         in.close();
         return buf; //buf๋ฐ˜ํ™˜
      }catch(Exception ex) {
         ex.printStackTrace();
      }
      return null;
   }
}
cs

์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ byte ๋ฐฐ์—ด๋กœ ์ „ํ™˜๋˜์–ด ์ „์†ก๋œ๋‹ค. ๋”ฐ๋ผ์„œ stream์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๊ธฐ</title>
</head>
<body>
<p></p>
<h3>์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๊ธฐ</h3>
 
<img src="/image/anjelina.jfif">
 
<!-- src์˜ ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋œ url์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 
ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค 
-->
</body>
</html>
cs

 

 

Thymeleaf์—์„œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ด๋ฏธ์ง€ ๋„์šฐ๋Š” ๋ฐฉ๋ฒ•

1
<img th:src="@{/dageul/getprofile/}+${member.profile}" align="left" width="96px" height="117px" />
cs

 

dageul/getprofile/ : url

${member.profile} : ํŒŒ์ผ๋ช…

 

 

 

 

 

๋Œ“๊ธ€