기존에 개념적으로 너무 가볍게 읽고 간 부분이라서 좀 깊숙히 배우려 노력하였지만.. 역시나 어려워서

코드로 배우는 스프링 책을 참고 하였다.(스프링을 배우기에 가장 좋은 책이라 생각함)

0. 파일을 올리는 것은 살짝 다르다.

일단 파일 자체는 DB에 저장이 되지 않는다. 따로 Storage를 통해 저장을 한다.

(물론 파일명을 저장할 DB는 필요로 하다)

방금 위에서 언급 했지만 제일 중요한 것은 바로 파일 명이다.

1. 파일을 업로드 한다는 것은 결국 파일의 경로를 지정해주는 일이다.

즉 쉽게 생각하면 경로 하나에(폴더 하나에) 모든 파일을 다 때려 넣을 수 있으나

이럴 경우 추후 관리하기 힘들므로


- 파일 마다 고유의 랜덤값 부여를 통한 중복 방지

- 파일 경로를 년, 월, 일로 구분하여 추후 관리를 편리하게

- 이미지 파일 등의 특정 파일들은 다른 기능들을 추가(염두) 


등으로 구분 할 수 있다.


즉 파일 업로드를 위해선 파일명과 경로(폴더)를 어떻게 생성해야할지 고민하고 이를 코드로 표현 하는 것이다.


2. 파일명을 고민 하기 전에 폴더부터 생성하자.

즉 abc라는 큰 폴더 아래 2018/06/04 이런식으로(2018, 06, 04 이렇게 3개의 폴더를 생성) 생성하는 것이 목표이다.

따라서 위에 폴더를 생성하고 이를 String으로 표현하여 사용하면 된다.

다만 이를 좀더 편하게 하기 위해 xml 상에 bean으로 생성하고 해당 bean을 resource로 넣는 방법도 있다.




3. 이제는 위에 경로 안에다가 내가 만든 경로 규칙을 통해서 넣어주면 된다.


위에처럼 ajax로 신호를 받으면 ResponseEntity를 통해서 대답을 한다.

경로를 생성하는 부분은 fileUtils 라는 메서드를 통해서 진행한다

이 친구는 uploadPath(파일 폴더 경로 중 제일위), file의 원본이름, file 데이타를 매개인자로 받는다.


4. 파일의 폴더 생성하는 메서드는 아래와 같다.


3개의 경로를 받으면


4.1. UUID를 통해 랜덤값을 생성하고 이를 file이름 앞에 붙인다

극단적 예시는 다음과 같다... : afasfjlkas_hoya.jpg  이런식으로 uuid + "_" + filename이 생성된다.


4.2. path를 생성 해주는데 이를위해서 calcPath라는 메서드를 사용한다

바로 아래에 저장해도 되지만 관리의 용이성을 위해 년, 월, 일 등으로 구분하려 한다.



이 친구이다. 뭔가 엄청 복잡해 보이는데 결국은 년, 월, 일만 뽑고 이를 경로로 표현 하는 친구이다...

중간에 DecimalFormat("00")은 단지 월의 표현을 두글자 06, 12, 등으로 표현하기 위해 사용한다.


makeDir이란 함수는... 경로를 만들어준다. 즉 calcPath는 년,월,일의 경로만 생성하고 이를 makeDir에 넘겨서 폴더를 만든다.



paths는 총 3개의 인자를 갖고 있는 배열이다. 그리고 제일 마지막 인자(총 3개의 인자니까 인덱스로는 2번)가 존재하면 경로 생성안한다(바로 return)

위의 경우가 아닐 경우 폴더를 만든다.



5. 다시 돌아오자.


이제 파일과 경로가 다 생성되어 저장까지 되었다. 중간부분에 formatName 부분은 이미지 파일을 구분해주기 위해 추가한 메서드 이다.

이는 나중에 다시 설명하겠다..


+ Recent posts