commons-fileupload 라이브러리를 통한 파일 업로드를 구현하기 위해서는 라브러리를 다운받아 lib폴더에 넣어주어야 한다.
commons-fileupload-버젼.jar ( 주소 : http://commons.apache.org/proper/commons-fileupload/ )
commons-id-버젼.jar ( 주소 : http://commons.apache.org/proper/commons-io/ )
1. 입력 폼 만들기
1 2 3 4 5 6 | <form id="go_form" name="go_form" method="post" enctype="multipart/form-data" action="img-upload.jsp"> 이름<input type="text" placeholder="이름을 입력하세요" name="user_name" maxlength="20" id="user_name"> 파일<input type="file" id="user_img" name="user_img"> <button type="button" id="delFile" onclick="del_file()">파일 삭제</button> <button type="submit">submit</button> </form> | cs |
- 입력폼의 method를 POST로 지정하고, enctype 속성의 값을 multipart/form-data로 설정한다.
사진, 동영상 등 글자가 아닌 파일은 모두 Multipart 형식의 데이터이다. 따라서 파일 업로드 시 enctype 설정을 꼭 해야한다.
- 파일 업로드와 함께 텍스트 형식의 폼 데이터도 함께 전송한다.
- 파일 삭제 버튼을 누르면 업로드했던 파일이 삭제된다.
2. img-upload.jsp에서 요청을 받아 처리한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <% // request로 들어온 데이터 저장할 변수 선언 Map<String, String> user = new HashMap<String, String>(); // 이미지는 서버에 저장 String saveDir = application.getRealPath("/image/"); // 저장할 경로 지정 // 유효한 request인지 확인 boolean isMultipart = FileUpload.isMultipartContent(request); String fileName = ""; // 업로드한 파일의 이름을 저장할 변수 설정 try { if(isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory(); // 파일 업로드 핸들러 생성 ServletFileUpload upload = new ServletFileUpload(factory); // 한글 인코딩 upload.setHeaderEncoding("UTF-8"); // request parsing List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); // 한글 인코딩 item.getString("UTF-8"); if (item.isFormField()) { // file 형식이 아닐 때 String name = item.getFieldName(); // 필드 이름 String value = new String((item.getString()).getBytes("8859_1"),"utf-8"); // 필드 값, 한글 인코딩 user.put(name,value); } else { // file 형식일 때 fileName = new File(item.getName()).getName(); File storeFile = new File(saveDir + "/" + fileName); user.put("user_img",fileName); // saves the file on disk item.write(storeFile); } } } } catch ( Exception e ) { System.out.println(e); } %> | cs |
- ServletFileUpload.isMultipartContent(request) : 전송된 데이터가 multipart/form-data형식으로 전송되었는지 여부 확인
- multipart/form-data 형식으로 넘어온 경우 기존의 request.getParameter("name") 방식으로 값을 꺼낼 수 없기때문에 위의 방법 사용
- FileItem 클래스는 multipart/form-data로 전송된 파라미터 또는 파일 정보를 저장하고 있는 클래스이다.
FileItem 클래스가 제공하는 메소드
메소드 |
리턴타입 |
설명 |
isFormField() |
boolean |
파일이 아닌 일반적인 입력 파라미터일 경우 true를 리턴한다. |
getFieldName() |
String |
파라미터 이름을 구한다. |
getString() |
String |
기본 캐릭터 셋을 사용하여 파라미터의 값을 구한다. |
getString(String encoding) |
String |
지정한 인코딩을 사용하여 파라미터의 값을 구한다. |
getName() |
String |
업로드한 파일의 (경로를 제외한) 이름을 구한다. |
getSize() |
long |
업로드한 파일의 크기를 구한다. |
write(File file) |
void |
업로드한 파일을 file이 나타내는 파일로 저장한다. |
getInputStream() |
inputStream |
업로드한 파일을 읽어오는 입력 스트림을 리턴한다. |
get() |
byte[] |
업로드한 파일을 byte배열로 구한다. |
isInMemory |
boolean |
업로드한 파일이 메모리에 저장된 상태인 경우 true를 리턴하고, 임시 디렉터리에 파일로 저장된 경우 false를 리턴한다. |
delete() |
void |
파일과 관련된 자원을 제거한다. 메모리에 저장된 경우 할당된 메모리를 반환하고 임시 파일로 저장된 경우 파일을 삭제한다. |
참고 - https://m.blog.naver.com/PostView.nhn?blogId=javaking75&logNo=220056175936&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
'웹' 카테고리의 다른 글
[html]head태그 안의 meta태그(링크첨부) (0) | 2018.07.11 |
---|---|
[html]input text에서 엔터누를 때 새로고침 (0) | 2018.07.11 |
[html]a태그 onclick 사용하기 (0) | 2018.06.29 |
[html]html 특수문자 표(펌글) (0) | 2018.06.28 |
[ASCII]아스키코드의 인코딩 값(펌글) (0) | 2018.06.28 |