blob ( Binary Large Object) 의 약자이다.
- 파일의 내용을 바이트 단위로 저장하기 위한 데이터 타입
- 파일을 저장할 때는 파일의 위치와 이름을 저장하는 방법과 BLOB으로 파일의 내용을 저장하는 2가지가 있다.
파일의 위치와 이름을 저장하는 방법은 파일의 위치나 이름을 마음대로 변경 할 수 없다는 단점이 있다.
- 데이터가 많은 곳에서는 파일의 이름이나 위치의 변경이 자주 일어나기 때문에 파일의 이름이나 위치를 저장한는 것보다 파일의 내용을 저장하는것이 더 이득이 될 때가 많다.
-자바에서는 blob을 사용하는 경우에 inputStream을 이요하는데,
저장할 때는 preparedStatement의 set을 이용해서 매피시켜 저장하고,
읽을때는 get을 이용해서 inpustStream을 반환 받아서 사용한다.
- 이미지파일, 텍스트파일, 엑셀파일 등 파일 자체를 저장할 때 사용하는 DB 필드 타입 중 하나.
form 요소
- name
- action
- method
- autocomplete : 자동완성. on으로 하면 from 전체 자동완성 허용한다.
- enctype : form data가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시한다.
( enctype 은 method 속성값이 post인 경우에만 사용할 수있다.)
1) enctype 속성값
[1] application/x-www-form-urlencoded
- default 값으로, 모든 문자들을 서버로 보내기 전에 인코딩 되는 것을 명시한다.
[2] text/plain
- 공백 문자(space)는 "+" 기호로 변환하지만,
나머지 문자는 모두 인코딩 되지 않음을 명시한다.
[3] mulipart/form-data
- 모든 문자를 인코딩하지 않음을 명시한다.
이 방식은 파일이나 이미지를 서버로 전송할 때 주로 사용한다.
getParmeter()의 사용
post 방식에서 request.getParameter() 메서드를
was에서 알아서 처리할 수 있도록 되어있는 이유는
form에서 method가 post 방식일 때는 default 값으로
enctype="application/x-www-form-urlencoded" 옵션이 설정 되어있기 때문에
이를 was에서 인식하고 알아서 in/output방식으로 데이터를 처리하기 때문이다.
따라서, 이미지를 위해서 전송하는 경우 enctype을 mulipart로 설정해야 하기 때문에,
request.getParameter() 로 데이터를불러 올 수 없게된다.
Multipart가 생긴이유
파일을 업로드 할때, 사진 설명을 위한 input과 사진을 위한 input 2개가 들어간다고 가정한다.
이 두 input간에 Content-type은 사진설명은 application/x-www-form-urlencoded이 될것이고,
사진 파일은 image/jpeg 이다.
두 종류의 데이터가 하나의 HTTP Request Body에 들어가야 하는데,
한 Body에서 이 2종류의 데이터를 구분해서 넣어주는 방법이 필요해졌다.
그래서 등장한것이 multipart 타입이다.
MultipartRequest
MultipartRequest multi = new MultipartReqeust(request,savePath,sizeLimit,"utf-8",new DafaultFileRenamePolicy());
- HttpServletRequest request = request 객체
- String saveDirectory = 저장될 서버 경로
- int maxPostSize = 파일 최대 크기
- String encoding = 인코딩 방식
- FileRenamePolicy policiy = 같은 이름의 파일명 방지처리
관련메서드
mr.getContentType("name");
보낸 파일의 형태가 무엇인지를 반환한다.
-> 이미지 파일만 허용하는 등의기능에서 사용 ex) image/jpeg(jpg일 경우)
mr.getOriginalFilename("form에서 보낸 파일의 name");
-> form에서 선택한 원래 파일의이름
mr.getFilesystemname("form에서 보낸 파일의 name");
-> 업로드된 파일의 이름 (리네임 되었을 시 리네임된 이름)
mr.getFile("form에서 보낸 파일의 name");
-> 업로드한 파일의 객체를 반환 -File
mr.getFileNames()
-> 파일형태의 인풋데이터의 name 속성을 Enumeration 객체로 반환해 준다.
따라서 fo-each문으로 name을 뽑아 낼 수 있다.
1. form submit 시 enctype="multipart/form-data" 속성 추가
2. form의 전송을 받은 부분에서 해당 내용을 MultipartRequest로 받아
stream으로 변형
3. stream으로 바꾼 것을 PreparedStatement에서 변수로 넣을 때
setBlob로 지정해 저
'Etc' 카테고리의 다른 글
REST (0) | 2021.07.28 |
---|---|
이클립스 프로젝트 파일 자동 새로고침 (0) | 2021.07.26 |
String.getBytes() 스트링을 인코딩,디코딩하는 이유? (0) | 2021.07.21 |
jdbc) Execute, ExecuteQuery, ExecuteUpdate 차이점 (0) | 2021.07.20 |
gitHub 기본 지식 (0) | 2021.07.16 |