-- Index --
1. enctype | 2. @MultipartConfig | 3. getPart() | 4. 파일 읽어와서 서버에 등록하기 |
5. 보조스트림활용해서 읽고/쓰기 |
6. ChangeName | 7. DB - INSERT작업 |
<form> 태그의 속성 지정 필요 |
maxFileSize와 maxRequestSize 지정 필요 |
파일을 가져올때는 getPart() |
인풋스트림(읽고) 아웃풋스트림(쓰고) |
bufferd스트림 활용 |
ext now random |
if문 result2 초기값 separator |
0.파일 입력받기
# 사용자로부터 파일 전달받으면 어떻게 할 건지??
- 다운로드할 필요 없이 파일 경로만 알고 있으면 된다.
- 우리는 그럼 톰캣이 돌아가고 있는 서버에다가 사진 넣어놓고 사진 경로만 잘 처리해줘서 보여주면 된다.
# 흐름 파악
- 사용자가 선택한 파일을 서버에 업로드 ( server/ upload 폴더에 )
- 그다음 파일의 경로를 DB에다가 저장
# 클라이언트가 서버에 파일을 보내면
- 우리는 2가지 작업 – [ 1. 서버에 업로드 -> 2. 디비에 파일 경로 저장 ]
1. form 태그의 enctype 체크 - 보내는 쪽( 클라이언트 )
- 몰랐지만 우리가 지금까지 데이터 보낼 때
- enctype 은 "application/x-www-form-urlencoded"이거였다.
- 파일은 이걸로 보내면 안된다.
- enctype="multiplart/form-data" 로 보내기
2. @MultipartConfig 설정 체크 - 받는 쪽 ( 서블릿 )
- 일반적으로 가져오면 못 가져온다.
설정하는 애들 설명
2-1. fileSizeThreshold
- Thread 가 작업할 때 혼자서 작업하기 버거울 때 – 쓰레드가 한 번에 50개 작업할 수 있는데 100 작업이 들어오면 – 50 처리하고 나머지 50 어디에 저장해놓고 – 그다음 저장해놓은 50 불러와서 처리하는 것인데 – 이때 Thread 가 한 번에 처리하는 양 지정해 주는 게 fileSizeThreshold
- byte단위로 지정해 주어야 한다. - 1024 (1KB) * 1024(KB) - 1MB 될 것이다. - 3MB 들어오면 – 3MB들어오면 1MB 작업하고 나머지 2MB는 location 경로에 두고 꺼내서 처리
2-2. location
- 나머지 애들 어디에 저장해 놓을지? 지정하는 거 – 여기에 담아놓고 – 사용
------------------ 이 2개는 기본 설정으로 사용하는 것이 좋다. --------------
2-3. maxFileSize
- 1024 * 1024 * 50
- 요청의 최대 크기 ---> 파일 하나의 사이즈
2-4. maxRequestSize
- 1024 * 1024 * 50 * 5
- 사용자가 파일을 여러 개 보낼 수 있잖아요. 50M짜리 5개까지만 허용하겠다. 이런 느낌으로 사용
2-5. @MultipartConfig() 설정 -- 클래스 위쪽에 설정!
3. 파일을 가져올 때는 - getPart()
- getParameter로 파일 가져오면 null 나온다.
# 새로 만난 part 무엇이 있는지 알아보기 #
# Part 객체 메서드 사용해보기#
헤더에서 콘텐츠 타입 꺼내오는 애구나.. 같으니까 필요 없겠다..
### 파일이 아닌 애들은 - contentType이 null로 나온다.
### 나중에 멀티 환경에서 처리할 때 contentType이 null이면 파일이 아니겠구나 체크
여기있는 inputStream을 활용해서 – 우리 서버로 읽어오면 된다..
4. 파일 읽어와서 서버에 등록해주기 ( 내가 지정한 경로에 써주기 )
- 파일 읽어와서 내가 지정한 경로에 써주기
- 경로는 우리가 알고 있으니 따로 구할 필요 없고
- 파일명은 방금 구해보았죠?
- f.getSubmittedFilename()
4-1 원본 파일명 얻기
4-2 바이너리 데이터 가져오기
- 파일명만 가지고는 안된다. 파일 덩어리는 못 다룬다 – 바이너리 데이터 가져와야 한다.
어떤 파일에서 들어올 때 input스트림을 얻어서
어떤 객체로 만들고
이 객체를 tomcat서버에 file로 저장
읽어오고 보내고 / read 하고하고 write 하고 / 하면 파일 읽어오는 것이다.
4-3 코드로 흐름 체크
- is = inputStream 담아놓은 변수
- os = outputStream 담아놓은 변수
클라이언트가 업로드한 사진이 내 서버에 잘 들어온 거 확인!
파일 서버에 업로드 완료!
추가 문제점만 해결해 보기 ( #확장자, #보조스트림 )
5. 보조스트림 활용하여 파일 읽어오기
5-1 버퍼드인풋 스트림 / 버퍼드아웃풋 스트림
5-2 버퍼드스트림 활용해서 읽고 쓰고 하기
# 작동 방식 체크 #
# 최종 코드 확인 #
6. 내가 지정한 파일명으로 서버에 등록하기
6-1. CHANGE_NAME 사용하기
- 파일명이 같으면 – 덮어쓰기 되어버린다.
- 사용자가 보낸 파일 이름이 혹시 중복될 일 없도록 바꿔서 서버에 저장해주자.
- 사용자가 업로드한 파일에서 확장자 가져오기
6-2 메서드 만들어서 진행 - createChangeName( originName )
[ 확장자명 구하기 ] - ext
- 현재 문자열에서 마지막에 있는 . [점] 인덱스를 가져오고 - lastIndexOf()
- 그 점부터 뒤에 다 가져오기 - [ 확장자명 구하기 완료 ] - substring()
[ 중복되지 않도록 파일명 설정해주기 ] - now, random
- 온전한 이름으로 중복되지 않게 해주자 - 중복되지 않도록 어떻게 해 줄지?
# System.currentTimeMillis
- 밀리초까지 똑같기는 힘들다 – 1970년 기준 몇 밀리초 지났는지 시간 초가 나온다.
- - 이렇게 해도.. 정말 어떤 경우에는 똑같을 수 있다. 이것도 방지하기 위해 어떤 랜덤 숫자도 같이 설정해줄 것이다.
# UUID.randomUUID().toString()
- 랜덤 숫자 값 나온다.
이름 생성 완료!
컨트롤러에서 메서드 호출해서 사용하면
CHANGE_NAME 이름 얻기 완료!
여기까지 하면 사용자에게 입력받은 파일
읽어서 - 서버에 내가 지정한 경로에 쓰기까지 완료
## 이제 인서트 작업하러 가보자
# ATTACHMENT_VO 먼저 만들기
7. 컨트롤러 / 서비스 / dao 작업해주기!
7-1 컨트롤러 : 작업 먼저 시작
- 이 게시글 작성 메서드는 보드 테이블도 채워주어야 하고 어텐츠먼트테이블도 채워주어야 한다.
- 보더 테이블에 먼저 인서트 한다 – 왜? - 어느 게시글에 첨부할 건지 알아야 하므로!
- 보더 테이블에 먼저 인서트 해서 시퀀스를 얻어와야 한다.
- 보더에 인서트 하는 거랑 어탠치테이블에 인서트하는거랑 하나의 트랜잭션이므로
- 어탠치먼트 테이블 관련 vo도 같이 전달해주어야 한다.
↓
7-2 서비스 레이어 작업 : 인서트 작업 실행 조건 체크, return 값 체크
- 보더 인서트는 무조건하는게 맞지만
- 사용자가 파일첨부안하는 경우에는??
- insertAttachment 해주어야 하나? --- 아니다.
- f의 값이 null 인지 체크해서 파일 첨부한 거 없으면 안 하도록 해주어 한다.
- f null 체크하는 방법은? -- 제출된 파일명을 이용하여 체크!
# 파일을 첨부했는지 안 했는지 체크 #
# 파일 첨부가 되어서 if 문 통과할 시에만 파일 업로드 (INSERT)작업 해주기 #
이제 파일 있으면avo잘 담겨올테고 파일 없으면avo = null 해서 넘어올 것이다.
이거 이용해서 첨부파일 있어서 avo 객체가 null이 아닐 때만 인서트 되도록 해주자
# 작업 결과 올바르게 리턴되도록 기본값 설정과 리턴 값 설정하기 #
파일 첨부가 안 되어서 보더참조테이블에 인서트가 안되었어도,
보더에는 인서트 된 것이다.
잘 처리되도록 result2의 기본값을 1로 설정
8. DAO (INSERT) 작업 완료 후 다시 컨트롤러에서 다음 타자 선택해서 마무리 하기
- 인서트 2개 작업 완료 – 컨트롤러 가서 다음 타자 선택 마무리
### 현재 OS에 맞는 파일 구분자 가져오기 ###
- File.separator
- 윈도우에서는 ' / ' 입력된다.
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 8월' 카테고리의 다른 글
22.08.16 - [ WAS ] EL - Expression Language (0) | 2022.08.31 |
---|---|
22.08.15 - 광복절 휴강, 주말 개인과제 제출, 세미프로젝트 작업 (0) | 2022.08.31 |
22.08.11 - [ WAS ] 페이징 처리 (1) | 2022.08.31 |
22.08.10 - [ WAS ] 상세게시글 ( 목록이동 / 삭제하기 / 수정하기 ) (0) | 2022.08.30 |
22.08.09 - [ WAS ] 게시글 상세보기 페이지 작업 ( feat. 조회 수 증가 ) (0) | 2022.08.30 |