본문 바로가기

JSP&SERVLET

[JSP_Servlet] 파일업로드_인코딩

 

 

 

 

MIME type(text/plain, text/html) : Multipurpose Internet Mail Extensions > 메시지 컨텐츠 형식을 정의하기 위한 인터넷 표준.

MIME 메시지 : 브라우저에서 열릴 문서형식

위처럼 파일 업로드를 할 수 있는 클래스를 직접 작성할 수도 있겠지만, 이미 업로드된 파일을 처리해주는 쓸만한 라이브러리가 존재한다. Commons FileUpload ApI를 이용한

 

1.     위 캡처(이클립스) request.getContentType() 메서드의 결과 첫줄 > [].

2.     첫줄 boundary= 부분은 각각의 파라미터를 분류할 때 사용되는 구분자

3.     각각의 파라미터는 -------구분자를 통해서 분류됨

4.     Content-Disposition : 전송하는 파라미터의 이름을 나타냄 파일의 경우 파일명도 포함

5.     Content-Type : 업로드한 파라미터 타입

 

위의 예제처럼 직접 파일업로드를 처리하는 클래스를 직접 작성할 수도 있겠지만, 이미 업로드된 파일을 처리해 주는 쓸만한 라이브러리가 존재한다. Commons-fileupload, commons-io

 

 

 

 

 

17. ServletFileUpload.isMultipartContent : FileUpload API multipart/form-data로 전송된 파라미터인지 확인

19~24. FileItem 목록을 구함.

//2. 메모리나 파일로 업로드 파일 보관하는 FileItem Factory 설정

DiskFileItemFactory factory = new DiskFileItemFactory();

//3. 업로드 요청을 처리하는 ServletFileUpload 생성

ServletFileUpload upload = new ServletFileUpload(factory);

//4. 업로드 요청 파싱해서 FileItem 목록 구함

List<FileItem> items = upload.parseRequest(request);

29. isFormField() : 파일이 아닌 일반적인 입력 파라미터일 경우 true 리턴

30. getFieldName() : 파라미터의 이름을 구한다.

31. getString("UTF-8") : 기본 캐릭터 셋을 사용하여 파라미터의 값을 구한다.

37. item.getName() : 업로드 한 파일의 (경로를 제외한) 이름을 구한다.

38. getContentType() : text/plain, image/jpeg MIME 브라우저에서 열릴 형식

39. isInMemory() : 업로드 한 파일이 메모리에 저장된 경우 true, 임시디렉터리에 저장된 경우 false를 리턴

40. item.getSize() : 업로드 한 파일의 byte를 구한다.

 

 

 

 

 

 

용량지정. 경로지정

 

 

용량이 큰파일 FileOutputStream

 

 

 

 

 

 

 

 

 

파일과 설명을 올리면

 

 

 

 

post전송방식

application/x-www-form-urlencoded : 일반적인 인코딩 방식

multipart/form-data : 파일업로드의 인코딩 방식

1.     인코딩을 하는 이유

-       URL ASCII Character-set으로만 구성되어야 하기 때문에 한글을 포함한 대부분의 외국어나 ASCII에 정의 되지 않은 특수문자의 경우 URL

 URL 내에서 의미를 갖고 있는 문자(%,?,#) URL에 올 수 없는 문자(Space) 혹은 System에서 해석이 될 수 있는 문자(<,>)를 치환하여 야기될 수 있는 문제점을 예방하기 위해서

 

 

파일업로드 관련 jar파일 (위의 예제처럼 클래스를 직접 작성해서 jar파일 없이도 파일업로드는 가능하다.) 편의를 위해 사용

 

위와 동일경로 upload.jsp

12. FileUpload API multipart/form-data로 전송된 파라미터인지 확인

14. HttpServletResponse.SC_BAD_REQUEST > HttpServletResponse 인터페이스에 final static 변수로 400으로 지정되어 있음

14. response.setStatus : 400상태로 세팅

17. 메모리나 파일로 업로드 파일 보관하는 FileItem Factory 설정

DiskFileItemFactory factory = new DiskFileItemFactory();

19. FileItem 목록을 구함.

18. 업로드 요청을 처리하는 ServletFileUpload 생성

ServletFileUpload upload = new ServletFileUpload(factory);

19. 업로드 요청 파싱해서 FileItem 목록 구함

List<FileItem> items = upload.parseRequest(request);

20. AddRequest : 아래 스샷 참조(VO)

24. isFormField() : 파일이 아닌 일반적인 입력 파라미터일 경우 true 리턴

30. getFieldName() : 파라미터의 이름을 구한다.

34. getInputStream() : 바이너리로 읽음 > 파일이 생성되고, c:\pds\1525767747987_19 결국 풀경로를 리턴받음

35. item.getName() : 업로드 한 파일의 (경로를 제외한) 이름을 구한다.

41. 파일명 인서트하고 파일정보 VO에 넣고 끝

 

 

 

 

FileSaveHelper

14.System.currentTimeMillis : 1970 1 1일 자정부터 현재까지 카운트된 시간(파일명이 중복되어 덮어 씌워질수있기에)

15. ex> nextInt(50) : 0~50 까지의 난수를 설정

18. 파일객체생성

24. read(8096) : 8096만큼 읽고 그 수를 리턴 즉 -1이 될때까지 outputStream에 씀(여기서 파일이 생성됨). 파일을 계속 읽음 8096(몇 기가든 상관없음)

35. getAbsolutePath : 파일명을 포함한 경로를 리턴 ex) c:\pds\1525767747987_19

 

 

 

AddPdsItemService

21. PdsItem VO에 파일네임,파일명 등이 세팅되어 있는 객체가옴. 이 객체를 DAO

    > 파일정보를 인서트하고 PK값을 리턴 받음

 

 

Pds.jocl

1.     Dbcp 커넥션풀 사용법 해당 jar파일을 해당위치에 위치시킴

2.     15라인 string null=”true” > 커넥션이 유효한지의 여부를 검사할 때 사용할 쿼리

쿼리를 지정해주고 싶을 때에는 <string value=”select count(*) fro member”/>

3.     17라인 Boolean value=”false” > 커넥션을 읽기 전용으로 생성할지 여부, insert, update, delete 작업이 있다면 false로 지정해야함

4.     19라인 true : 커넥션을 자동 커밋 모드로 설정할 경우 true 그렇지 않을경우 false 일반적으로 true를 사용함

 

 

 

 

DBCPInit

28~29. Class.forName을 통해 드라이버 로드 자세한 내용은 JSP/classforname편 참조

28~29. commons 커넥션풀 사용시 class.forName으로 2개를 로딩시켜야함

 

PdsItemDao > 파일명을 인서트한 후 PK값 리턴

31. excuteUpdate : 리턴값 업데이트된 행의 개수를 리턴, 아무일도 없었으면 0

35. last_insert_id() : 마지막에 인서트한 PK값을가져온다.(커넥션별로 다르다)

 

목록보기 클릭시

 

리스트 뿌려주기, 다운로드 카운트 생략 다운받기 클릭시 바로 위처럼 다운로드

 

List_view.jsp

 

 

Download.jsp

1.     pageEncoding : WAS JSP를 읽어들일 때 사용되는 인코딩

15. reset : response.getOutputStream() 호출 시 out jsp에서 servlet으로 변환될 때 생성되는 out과 충돌이 일어난다. 그러므로 리셋시킴

12. item : PK값이 있는지 확인하고 디비에서 파일정보를 불러옴

17.   String.getBytes(“인코딩명”) : 유니코드문자열을 인자로 지정된 캐릭터셋의 바이트 배열로 반환 즉 euc-kr의 케릭터셋으로 바이트로 저장

Ø  캐릭터셋 : 문자가 컴퓨터에 저장될 때 어떠한 코드로 저장될지에 대한 규칙의 집합

New String(byte[], “인코딩명”) : 해당 바이트배열을 주어진 캐릭터셋으로 간주하여 스트링을 만드는 생성자

Ø  요렇게 해주는 이유는 euc-kr형태로 바이너리 배열로 변환을 한 상태 그 자체를 String형으로 변환시켜주려면(바이트는 127 ISO에서 표현을 할 수 있기에)

Ø  헤더는 ISO타입으로 전달해야한다. 또한 euc-kr로 인코딩된 String형을 던지는거 이기에 한글명이 안깨지는 거임. 모두 인코딩해서 던지게 되어 있으니까..

19.   application/octet-stream : 다운로드를 위한 콘텐츠 타입 설정

20~21. Content-disposition: attachment : 다운로드시 무조건 파일다운로드로

22. Content-Transfer-Encoding : 전송 데이타의 body를 인코딩한 방법[인코딩 방식]을 표시함.

23. response.setContentLength : 파일크기를 세팅해줘야함. 아니면 계속 기다림

24. response.setHeader("Pragma", "no-cache;") : HTTP 1.0버전에서 지원하는 헤더로, 응답 결과를 캐시에 저장하지 않음.

> response.setHeader(“Cache-Control”, “no-cache”) : HTTP 1.1버전에서 위와 동일

25.Expires: Wed, 21 Oct 2015 07:28:00 GMT 옆에와 같이 날짜를 써줘야하는 것이 일반적이나 0이나 1과 같은 값을 입력해서 현재시간 이전으로 만료일을 지정함으로써 응답 결과가 캐시되지 않도록 설정

26~. outputstream으로 파일을 쓰고 카운트하고 끝

34. 파일이 존재하지 않으면 404상태코드 전달

 

 

PK값이 있는지 확인 있으면 파일정보를 DB에서 받아와서 pdsItem 리턴

 

 

FileDownloadHelpers

 

 

 

'JSP&SERVLET' 카테고리의 다른 글

[JSP_Servlet] EL_JSTL_taglib  (0) 2021.03.26
[Java/JSP] JDBC 데이터베이스 프로그래밍  (0) 2021.03.25
[JSP_Servlet] 쿠키  (0) 2021.03.24
[JSP_Servlet] include_forward_param  (0) 2021.03.23
[JSP&Servlet] push 채팅  (0) 2021.03.22