파일 업로드 및 다운로드 예제

  • 상품 관리

    • 상품 이름

    • 첨부 파일 한 개

    • 이미지 파일 여러 개

  • 첨부 파일을 업로드, 다운로드 할 수 있다.

  • 업로드 한 이미지를 웹 브라우저에서 확인할 수 있다.

Item, UploadFile

@Data
public class Item {

    private Long id;
    private String itemName;
    private UploadFile attachFile;
    private List<UploadFile> imageFiles;

}
  • UploadFile은 파일 이름을 두 가지로 구분한다.

    • uploadFileName

      • 고객이 업로드 한 파일명

    • storeFileName

      • 서버 내부에서 관리하는 파일명

      • 여러 고객이 같은 이름을 쓰면 충돌이 나기 때문에 별도로 관리한다.

FileStore

  • multipart 파일을 서버에 저장한다.

  • createStoreFileName()

    • 서버에 저장할 파일 이름은 UUID를 써서 충돌을 방지한다.

  • extractExt()

    • 확장자를 따로 빼서 서버에 저장할 파일명에 붙여준다.

    • ex. 51041c62-86e4-4274-801d-614a7d994edb.png

ItemForm

  • 상품 저장을 요청하는 객체를 생성한다.

  • Item 도메인 객체와는 달리 UploadFile 대신 MultipartFile로 받는다.

  • MultipartFile은 @ModelAttribute를 통해 사용할 수 있다.

ItemController

  • 등록과 저장 화면을 위한 컨트롤러를 정의한다.

  • 저장한 아이템에 대한 페이지로 리다이렉트 한다.

  • 고객이 업로드 한 파일과 이미지를 보여준다.

  • @GetMapping("/images/{filename}")

    • 태그로 이미지를 조회할 때 사용한다.

    • UrlResource

      • 저장했던 이미지 파일을 읽는다.

    • @ResponseBody

      • 이미지를 바이너리로 반환한다.

  • @GetMapping("/attach/{itemId}"

    • 파일을 다운로드 한다.

    • 고객이 업로드 했던 이름으로 화면에 노출한다.

    • Content-Disposition 헤더를 적용해야 다운로드가 정상적으로 실행된다.

Last updated

Was this helpful?