💡 게시판 - 파일 다운로드

2026. 7. 20. 21:35·Project/나의 작은 프로젝트

이 글은 Velog에서 이전한 글입니다. Velog 원문 보기

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

'Project > 나의 작은 프로젝트' 카테고리의 다른 글

💡 게시판 - 검증(Bean Validation)  (0) 2026.07.21
💡 게시판 - 메시지, 국제화  (0) 2026.07.21
💡 게시판 - 파일 업로드 3(개선)  (0) 2026.07.20
💡 게시판 - 파일 업로드 2  (0) 2026.07.20
💡 게시판 - 파일 업로드  (0) 2026.07.20
'Project/나의 작은 프로젝트' 카테고리의 다른 글
  • 💡 게시판 - 검증(Bean Validation)
  • 💡 게시판 - 메시지, 국제화
  • 💡 게시판 - 파일 업로드 3(개선)
  • 💡 게시판 - 파일 업로드 2
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    Spring MVC
    척척학사
    Spring
    BOJ
    java
    개념 정리!
    HTTP WEB 기본 지식
    OS
    Book
    CS Interview
    interview
    object
    http
    jpa
    Algorithm
    트러블슈팅
    Project
    나의 작은 프로젝트
    게시판
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
💡 게시판 - 파일 다운로드
상단으로

티스토리툴바