πŸ’‘ κ²Œμ‹œνŒ - 파일 λ‹€μš΄λ‘œλ“œ

박상민·2023λ…„ 9μ›” 16일
0
post-thumbnail

BoardController μ•ˆμ˜ λ©”μ„œλ“œ

@GetMapping("/attach/{postId}")
public ResponseEntity<Resource> downloadAttach(@PathVariable Integer postId) throws MalformedURLException {
    Board post = boardService.findById(postId); //postλ₯Ό μ ‘κ·Όν•  수 μžˆλŠ” μ‚¬μš©μžλ§Œ 사진 λ‹€μš΄λ‘œλ“œ κ°€λŠ₯
    String imageFilename = post.getFilename(); //μ‚¬μš©μžκ°€ μ—…λ‘œλ“œν•œ 파일 이름
    String imageFilepath = post.getFilepath(); //DB에 μ €μž₯ν•˜λŠ” 파일 경둜

    UrlResource resource = new UrlResource("file:" + fileStore.getFullPath(imageFilepath));

    String encodedUploadFileName = UriUtils.encode(imageFilename, StandardCharsets.UTF_8); // ν•œκΈ€, νŠΉμˆ˜λ¬Έμžκ°€ κΉ¨μ§€λŠ” 것을 방지
    String contentDisposition = "attachment; filename=\"" + encodedUploadFileName + "\"";

    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
            .body(resource);
    }

downloadAttachλŠ” νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•  λ•Œ μ‹€ν–‰λ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
파일 λ‹€μš΄λ‘œλ“œ μ‹œ κΆŒν•œ 체크같은 λ³΅μž‘ν•œ μƒν™©κΉŒμ§€ κ°€μ •ν•΄μ„œ μ΄λ―Έμ§€μ˜ idλ₯Ό μš”μ²­ν•˜λ„λ‘ ν–ˆλ‹€.
λ˜ν•œ, 파일 λ‹€μš΄λ‘œλ“œμ‹œμ—λŠ” μ‚¬μš©μžκ°€ μ—…λ‘œλ“œν•œ 파일 μ΄λ¦„μœΌλ‘œ λ‹€μš΄λ‘œλ“œ ν•˜λŠ” 것이 쒋기에 Content-Disposition헀더에 attachment; filename="μ—…λ‘œλ“œ 파일λͺ…"값을 쀬닀.

boardDetail.html 쀑 파일 κ΄€λ ¨ html

<span th:if="${post.filepath != null}">
    <img th:src="@{'/images/' + ${post.filepath}}" width="300" height="300"/><br>
    <!--   파일 λ‹€μš΄λ‘œλ“œ   -->
    사진 λ‹€μš΄λ‘œλ“œ: <a th:href="|/attach/${post.id}|" th:text="${post.getFilename()}"/>
</span>

κ°„λ‹¨ν•œ 파일 λ‹€μš΄λ‘œλ“œ html이닀. th:textλ₯Ό μ΄μš©ν•΄ μ‚¬μš©μžκ°€ μ—…λ‘œλ“œν•œ 파일의 이름을 μ‚¬μš©ν–ˆλ‹€.

파일 λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯ κ΅¬ν˜„μ€ 끝났닀. μž‘λ™μ΄ 잘 λ˜λŠ”μ§€ ν™•μΈν•΄λ³΄μž.


이전에 μž‘μ„±ν•΄μ€€ κ²Œμ‹œκΈ€μ΄λ‹€. 밑에 μžˆλŠ” 사진 λ‹€μš΄λ‘œλ“œμ˜ 링크λ₯Ό ν΄λ¦­ν–ˆμ„λ•Œ 사진이 λ‹€μš΄λ‘œλ“œ λœλ‹€λ©΄ 성곡이닀.


λ‹€ν–‰νžˆ κΈ°λŠ₯이 잘 μž‘λ™ν•œλ‹€.


μ—¬μ „νžˆ λΆ€μ‘±ν•œ 점이 λ§Žλ‹€.

  • μ—…λ‘œλ“œν•œ νŒŒμΌμ„ μ‚­μ œν•˜κ²Œ λ§Œλ“€κ³  μ‹Άλ‹€.

  • μ²¨λΆ€νŒŒμΌ μ—…λ‘œλ“œ, λ‹€μš΄λ‘œλ“œ

λ“±λ“± 파일 μ—…λ‘œλ“œ 뢀뢄을 μ œμ™Έν•˜κ³  λ‹€λ₯Έ λΆ€λΆ„μ—μ„œλ„ μˆ˜μ •ν•΄μ•Ό ν•  뢀뢄이 λ§Žλ‹€.
μ•žμœΌλ‘œλŠ” κΉ€μ˜ν•œλ‹˜μ˜ Spring MVC2 κ°•μ˜λ₯Ό λ³΄λ©΄μ„œ 둜그인 κΈ°λŠ₯, μ„Έμ…˜, μΏ ν‚€ 등을 κ³΅λΆ€ν•˜κ³  λ‚˜μ˜ κ²Œμ‹œνŒμ— μΆ”κ°€ν•˜λ©΄μ„œ 곡뢀할 μ˜ˆμ •μ΄λ‹€. λ˜ν•œ, μ•žμœΌλ‘œλ„ κΎΈμ€€νžˆ μ΄μ „μ˜ μ½”λ“œλ“€μ„ κ°œμ„ μ‹œν‚¬ 것이닀.

개인적으둜 μ‘΄κ²½ν•˜λŠ” κ°œλ°œμžμ΄μ‹  κΉ€μ˜ν•œλ‹˜μ΄ κ°•μ˜λ₯Ό 듀을 λ•Œ 3가지λ₯Ό ν•˜λ©΄ μ‹€λ ₯ ν–₯상에 큰 도움이 λœλ‹€κ³  ν•˜μ…¨λ‹€.
1. κ°•μ˜λ₯Ό 보며 λ”°λΌμΉ˜κΈ°
2. κ°•μ˜ λ‚΄μš© μ •λ¦¬ν•˜κΈ°
3. 토이 ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©° μ μš©ν•˜κΈ°
μ²˜μŒμ—λŠ” κ°•μ˜λ₯Ό 보며 λ”°λΌμΉ˜κΈ°λ§Œ ν–ˆμ§€λ§Œ λ‹€μ‹œ ν•˜λ‚˜ν•˜λ‚˜ λ³΅μŠ΅μ„ ν•˜λ©΄μ„œ κ°•μ˜ λ‚΄μš© 정리λ₯Ό ν•˜κ³  ν”„λ‘œμ νŠΈμ— μ μš©λ„ μ‹œμΌœλ³΄κ³  μžˆλ‹€. μ‹€μ œλ‘œ 이해에 큰 도움이 λ˜λŠ” 것 κ°™λ‹€. 큰 도움이 되고 μžˆμŠ΅λ‹ˆλ‹€ μ˜ν•œλ‹˜!


κΈ€μ—μ„œ λΆ€μ‘±ν•œ 뢀뢄이 λ§Žμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. λͺ¨λ“  지적을 ν™˜μ˜ν•©λ‹ˆλ‹€!!

더 μžμ„Έν•œ μ½”λ“œλŠ” κΉƒν—ˆλΈŒλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!

κΉƒν—ˆλΈŒ: https://github.com/pp8817/ToyProjectBoard

profile
μŠ€ν”„λ§ λ°±μ—”λ“œλ₯Ό 곡뢀쀑인 λŒ€ν•™μƒμž…λ‹ˆλ‹€!

0개의 λŒ“κΈ€