TIL(Web)-2020.12.15(파일 업로드)

BYEONGJUN KIM(JUN)·2020년 12월 15일
0

TIL(Web)

목록 보기
10/45

오늘은 파일 업로드를 구현하는 학습을 하였습니다

Today I Learned

  • File Upload in web

File Upload

  • form 태그 설정
    • enctype="multipart/form-data"
    • 파일 전송을 위한 인코딩 방식(전송하는 내용 섹션마다 형식을 다르게 지정해 줌)
    • 문자열이 아닌 것이 전송될 수 있으므로 multi part설정해줘야함.

  • 파일 받을 준비
    • servlet 설정
      • MultipartConfig(멀티파트 설정)
@MultipartConfig(
    location="/tmp",//(저장될 디렉토리, 보통 사용하지 않음 나중에 경로 따로 설정함)
    fileSizeThreshold=10241024,//(이 크기를 넘으면 임시디렉토리에 저장)
    maxFileSize=102410245,//(파일 하나의 최대 크기)
    maxRequestSize=1024102455//(한 요청의 최대 크기)
 )
  • 파일 받아오기
    • multipart로 각 파트를 쪼개 보내온 파트를 받아오기
Part filePart = request.getPart("file");
filePart.getSubmittedFileName();//(getString()은 바이너리로 가져올 수 있음)
  • 파일이 저장될 공간 설정하기
    • 파일은 기본적으로 배포경로인 톰캣의 실행경로로 저장함
    • 저장될 경로 만들기
    • 상대경로를 통해 절대경로(현재 실행되고있는 배포경로)를 알아내고, 그 경로가 존재하는지 유무 검사 후 존재하지 않는다면 경로 생성(realpath)
String pathTemp = request.getServletContext().getRealPath("/static/notice/2020/26");//서블릿들이 필요로 하는 공통 자원

File path = new File(pathTemp);
if(!path.exists())
	path.mkdirs();
  • 해당 경로에 파일 저장
    • 저장될 경로 설정하기
    • File.separator를 이용하여 구분(운영체제별 디렉토리 구분자가 다르기 때문)
    • inputstream으로 파일을 읽어와서 fileoutputstream으로 파일 작성
String filePath = pathTemp + File.separator + filePart.getSubmittedFileName();

InputStream fis = filePart.getInputStream();
FileOutputStream fos = new FileOutputStream(filePath);
int size = 0;
byte[] buf = new byte[1024];
while((size = fis.read(buf)) != -1) {
	fos.write(buf, 0, size);
}

fos.close();
fis.close();
  • 저장될 게시글 번호 설정하기
    • 예제에서는 수기로 26이라는 게시글 번호(디렉토리)를 임의로 두었다.
    • 하지만 이 번호는 가변적이므로 그때그때 구하는 로직이 필요하다.
    • service와 dao를 통해 lastId값을 구하는 방식으로 접근한다.
    • 년도수를 알아보는 방법은 따로 알아보도록 하자
  • 예외처리
    • 파일이 첨부되지 않았을때
      • filePart가 null이 아닐때만 수행하도록
    • 파일이 여러개 첨부되었을 때
      • 전송하는 파일이 file이라는 이름으로 올때, request.getParts("file")로 가져올 수 있음
      • Part 타입 콜렉션으로 반환
    • for문으로 하나씩 꺼내보는데 if(p.getName().equals("file") && p.getSize()>0)으로 구별해내기
    • 파일로 이루어진 파트만 구별해내서 작업하면 됨
  • 해당 entity에 저장할 때에는 fileName을 문자열로 해서 누적시키는방식(콤마, 로 구분한다)

오늘은 파일 업로드에 대하여 학습하였습니다.
이상입니다.

profile
Web Backend 개발자

0개의 댓글

관련 채용 정보