-
[JSP] 파일 업로드기초/JSP 2017. 3. 15. 13:40
서버 안에 특정 폴더, Upload된 파일을 담을 폴더를 만든다.
/upload
이름이 2가지가 있다
오리지널 이름 : 사용자가 올린 파일 이름
시스템 이름 : 업로드 파일의 이름이 중복되어 바뀐 이름
중복되지 않았다면 오리지널 이름과 시스템 이름이 같겠지만
중복되면 달라진다
ex) 새폴더 , 새폴더(2)
일단 파일을 사용하기 위해서 MultipartRequest.class가 들어있는 jar파일을 다운한다
*cos 라이브러리
#1. 다운로드 받기 : cos.jar
1)www.servlets.com
2)com.oreilly.servlet
3)cos-26Dec2008.zip
4)압축풀기
5)cos-26Dec2008\lib\에 cos.jar
6)이클립스 webContent\web-inf\lib에 붙여넣기
MultipartRequest.class를 사용하기 위해(5개의 인수가 존재)
<input type="file" > 파일 다이얼로그가 나온다.
그냥 type속성만 쓰면 파일의 내용이 아니라 제목만 올라간다 따라서 속성에 enctpye="" 을 부여해서 어떤 타입이 올라가는지 알려줘야 한다.
[enctype]
form 속성에 enctype = "multipart/form-data" 속성을 부여하자
<%@page import="java.io.File"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//업로드 시켜야 하는데 실제 경로는 어떻게 되나?
//.metadata안에 ......wtpwebapps안에 프로젝트 ...에있는데
// 프로젝트까지 getServletContext()로 가져올수 있다
// 하위폴더 upload에 저장하기 위해서 + \\upload를 해준다
// \ + u는 유니코드이므로 ... 주석에서도 에러처리가 난다!
String realFolder = "";
//현재 업로드 폴더의 이름
String saveFolder = "upload";
int maxSize = 5*1024*1024; // b > kb > mb > gb
String encType="utf-8";
//경로만들기!
ServletContext context = request.getServletContext();
System.out.println("context의 경로 : "+context.getContextPath());
System.out.println("context의 경로 : "+context.getRealPath(saveFolder));
MultipartRequest multi = null; //#1번
try{
multi = new MultipartRequest(
request, //요청받은내용 request또한 넣어놨다.
realFolder, //업로드 할 실제경로
maxSize, //한번에 업로드 할 때마다 최대 파일 크기
encType, //제목/내용등 인코딩 타입
new DefaultFileRenamePolicy() //중복이름 삭제
);
Enumeration en = multi.getParameterNames();
while(en.hasMoreElements()){
String name = (String)en.nextElement();
String value = multi.getParameter(name);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>업로드 하기</title>
</head>
<body>
<%=name %> : <%=value %><br>
<hr>
<%
Enumeration enFiles = multi.getFileNames();
while(enFiles.hasMoreElements()){
String fname = (String)enFiles.nextElement(); // map형식으로 랜덤하게
String sysFile = multi.getFilesystemName(fname); //업로드 이름
String orgFile = multi.getOriginalFileName(fname); //업로드 된 이름
String contextType = multi.getContentType(fname); //파일의 타입
File file = multi.getFile(fname);
long bytes = file.length();
out.println("===========================<br>");
out.println("파일명 : "+fname);
out.println("원본이름 : "+orgFile);
out.println("중복처리된 이름 : "+sysFile);
out.println("팡리 형식 : "+contextType);
out.println("용량 : "+bytes);
out.println("===========================<br>");
}
}
}catch(Exception e){e.printStackTrace();}
%>
</body>
</html>
가져오는 전체 소스이다
[경로 알아오기]
#프로젝트 - webcontent안에 upload라는 폴더를 따로 만들었다
upload라는 폴더에 넣고 싶어서 서버에 저장되는 경로를
contextpath로 가져오고
realpath를 사용하기로 했다
여기서 주목해야 할 점은 2가지다
#1 MultipartRequest
MultipartRequest multi = null;
*MultipartRequest 생성자*
new MultipartRequest(1, 2, 3, 4, 5);
1: request
2: String path
3: size(byte수)
4: encoding(utf-8 | euc-kr)
5: 중복이름 정책(인스턴스)
multi를 선언하는데 이때 cos.jar에 들어있는 MultipartRequest를 사용하기 위함이다.
1) MultipartRequest를 생성자를 통해 multi를 부여한다
!! request또한 인자로 보내기 떄문에
원래 사용하던 request대신 mutil로 가져오면 되는것이다
#2 file은 getFileNames();
로 읽어와야한다
따라서 enumeration 인터페이스를 2개를 만들어
하나는 parameter를
하나는 file을 가져와 처리했다
이때 파일에 대한 메소드가 있다
1) multipartRequest.getParameter(); // 잘 가져다 쓰면됨(랩핑했다고함)
2) getParameterValues()
3) getParameterNames()
4) getFileNames() : 파일이 여러개 일떄 !
5) getFileSystemNames(): 중복처리된 이름
6) getOriginFileNames(): 사용자가 올린이름
7) getContentType() : MIME 타입을 알아오자
8) getFile() : 업로드된 파일의 파일 객체를 반환하자!
systemNames는 중복이 처리된 이름이다
업로드시 파일이름이 겹치는 경우
ex) 새폴더 새폴더 -> 새폴더 새폴더(1)
새폴더(1)로 교체된 이름이며
새폴더 새폴더는 실제 이름이기에 OriginFileNames에 저장된다.
'기초 > JSP' 카테고리의 다른 글
[JSP]데이터 베이스 (0) 2017.03.20 [JSP] DB 환경설정(sql developer, eclipse) (2) 2017.03.17 [JSP] tag lib(fmt) (0) 2017.03.14 [JSP] tag lib 문법 (core) (0) 2017.03.14 [JSP] tag lib 다운및 //사용법(core) (0) 2017.03.10