๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ž๋ฐ”

Spring Boot file upload download rest api ์˜ˆ์ œ - 1

by moon101 2024. 2. 19.

๐Ÿ“ ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค์šด๋กœ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

์ฒซ ํšŒ์‚ฌ์˜ ์ˆ˜์Šต๊ณผ์ œ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“  ์ ์ด ์žˆ๋Š”๋ฐ ๊ฒ€์ƒ‰์„ ํ•˜๋ฉด JSP๋กœ ๊ตฌํ˜„๋œ ์˜ˆ์ œ๊ฐ€ ๋งŽ์•„์„œ ํ”„๋ก ํŠธ๊ฐ€ React๋‚˜ Vue์ผ๋•Œ ์–ด๋–ป๊ฒŒ ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค์šด๋กœ๋“œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ง‰๋ง‰ํ–ˆ์—ˆ๋‹ค. ๋‹คํ–‰์ด ๊นƒํ—ˆ๋ธŒ์—์„œ ์ž˜ ์ •๋ฆฌ๋œ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์„œ ๊ณผ์ œ๋ฅผ ์ž˜ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ํ•ด๋‹น ๊นƒํ—ˆ๋ธŒ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ ํ•  ๋•Œ ์•„์‰ฌ์› ๋˜ ์ ๊ณผ ๊ทธ๋•Œ๋Š” ์ž˜ ๋ชฐ๋ž๋˜ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

 

 

1๏ธโƒฃ Failed to perform cleanup of multipart items ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  • ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „ ๋ณ€๊ฒฝ์—์„œ inputStream.close() ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑธ๋กœ ์ˆ˜์ •

- Caused by: java.io.IOException: Cannot delete ๊ฒฝ๋กœ\ํŒŒ์ผ์ด๋ฆ„

์ฐธ๊ณ ํ•œ ๊นƒํ—ˆ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋–ด๋Š”๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „์„ ๋‚ฎ์ถฐ์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๊ทผ์— ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ฉด์„œ ๋˜ ์ด ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๊ณ  ์ด๋ฒˆ์—๋Š” ๋ฒ„์ „์„ ๋‚ฎ์ถ”๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‹ค. ๋ฌธ์ œ์›์ธ์„ ์ฐพ์•„๋ณด๋‹ˆ ์—ด๋ ค์žˆ๋Š” inputStream์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๊ธฐ์กด 

file.getIntputStream() ๋ถ€๋ถ„์„ InputStream ๊ฐ์ฒด์— ๋‹ด์•˜๋‹ค๊ฐ€ Files.copy๊ฐ€ ๋๋‚œ ํ›„์— .close()๋กœ ๋‹ซ์•„์ฃผ๋‹ˆ ๋ฒ„์ „์„ ๋‚ฎ์ถ”์ง€ ์•Š์•„๋„ ์Šคํ”„๋ง ๋ถ€ํŠธ 2.7.8 ๋ฒ„์ „์—์„œ๋„ ์˜ค๋ฅ˜์—†์ด ํŒŒ์ผ์ด ์ž˜ ์ €์žฅ๋˜์—ˆ๋‹ค. 

์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋Š” file.getInputStream()๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ  ๋‹ค์‹œ close ํ•ด์ฃผ์—ˆ๋‹ค

 

 

2๏ธโƒฃ ์ •๊ทœํ‘œํ˜„์‹

 

ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณด๋ฉด {fileName:.+} ๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ fileName์€ pathVariable๋ฅผ ์˜๋ฏธํ•˜๊ณ  fileName์— .+ ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ . ํ•˜๊ณ  + ์ •๊ทœํ‘œํ˜„์‹์˜ ๋œป์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

- .(dot): ANY ONE character except newline. Same as [^\n]

- +: one or more (1+), e.g., [0-9]+ matches one or more digits such as '123', '000'

 

๋”ฐ๋ผ์„œ fileName์—๋Š” ํ•œ๊ฐœ ์ด์ƒ์˜ ์–ด๋–ค ๋ฌธ์ž๋“  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 

 

 

๊ฐ„๋‹จํ•œ ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ฅผ ๊นƒํ—ˆ๋ธŒ ์ €์žฅ์†Œ์— ์˜ฌ๋ ค๋†“์•˜๋Š”๋ฐ, ํฌ์ŠคํŠธ๋งจ์„ ํ™œ์šฉํ•ด์„œ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

// TODO. ์Šคํ”„๋ง ๋ถ€ํŠธ 3.*.* ๋Œ€ ๋ฒ„์ „์—์„œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋„ ๋ฌธ์ œ์—†์ด ์‹คํ–‰์ด ๋˜๋Š”๋ฐ javax.servlet (JavaEE)์—์„œ jakarta.servlet (Jakarta EE)๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ์ž„์‹œํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„์ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ถ€๋ถ„๋„ ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค. 

 

// TODO. ํŒŒ์ผ ๊ถŒํ™˜ ๋ฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ถ€๋ถ„

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://www.callicoder.com/spring-boot-file-upload-download-rest-api-example/

https://github.com/callicoder/spring-boot-file-upload-download-rest-api-example

https://www3.ntu.edu.sg/HOME/EHCHUA/PROGRAMMING/java/Java_Regexe.html

https://www3.ntu.edu.sg/HOME/EHCHUA/PROGRAMMING/howto/Regexe.html

 

 
 
 
 
 

๋Œ“๊ธ€