파일 업로드 및 다운로드 예제
상품 관리
상품 이름
첨부 파일 한 개
이미지 파일 여러 개
첨부 파일을 업로드, 다운로드 할 수 있다.
업로드 한 이미지를 웹 브라우저에서 확인할 수 있다.
Item, UploadFile
@Data
public class Item {
private Long id;
private String itemName;
private UploadFile attachFile;
private List<UploadFile> imageFiles;
}@Data
public class UploadFile {
// 업로드 한 파일 이름
// 나중에 고객이 업로드 한 파일 리스트를 보여줄 때 출력한다.
private String uploadFileName;
// 시스템에 올린 파일 이름
// 사용자들이 같은 이름으로 파일을 올릴 수 있기 때문에 둘을 구분한다.
private String storeFileName;
public UploadFile(String uploadFileName, String storeFileName) {
this.uploadFileName = uploadFileName;
this.storeFileName = storeFileName;
}
}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?