방법

1. oreilly에서 만든 라이브러리 사용하기

2. Apache에서 만든 라이브러리 사용하기

 

oreilly에서 만든 라이브러리 사용

Servlets.com | com.oreilly.servlet

 

Servlets.com | com.oreilly.servlet

 

www.servlets.com

위 사이트에 들어가서 MulitpartRequest 클래스를 사용하여 업로드할 수 있다.

 

페이지 아래 쪽에 jar파일을 다운로드받을 수 있게 제공해준다. jar파일을 라이브러리에 등록해준다.

<%@page import="java.io.File"%>
<%@page import="common.FileManager"%>
<%@page import="java.io.IOException"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%
	/*
클라이언트가 전송한 제목, 텍스트 및 바이너리 파일을 서버의 특정 디렉토리에 저장해보자
= 업로드라 한다!!
*/
request.setCharacterEncoding("utf-8");//파라미터 한글 깨지지 않게 인코딩
//String msg = request.getParameter("msg");//String 메시지 받기

//이미지는 글씨가 아닌 바이너리 파일이므로, request.getParameter로는 받을 수 없다!
//따라서 IO, 네트워크 등의 처리를 해야 하는데, 이 자체만으로도 하나의 개발 프로젝트일 것이다.
//해결책?? 누군가 만든 라이브러리를 이용해서 개발시간을 단축하자!!
//현재 우리가 선택한 라이브러리는 cos.jar라는 Oreilly라는 출판사에서 제작한 컴포넌트이다!!
String saveDirectory = "C:/workspace/javaee_workspace/BoardApp/WebContent/data";//하드디스크의 물리적 경로를 명시해야 한다!!
int maxSize = 1024 * 1024 * 2; //2MByte
String encoding = "utf-8";
//FileRenamePolicy policy : 업로드 시 , 동일한 파일을 업로드했을 때?? 자동으로 이름을 부여한다...
//예) p.jpg, 1p.png.. (파일명은 개발자가 주도하여 명명하므로, policy를 굳이 이용할 필요 없다.)
try {
	MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxSize, encoding);
	//업로드 컴포넌트를 이용할 경우, 스트링 파라미터도 업로드 컴포넌트를 이용해야한다!!
	String msg = multi.getParameter("msg");
	//out.print("전송한 메시지는 " + msg);
	//업로드가 완료된 후, 즉 서버의 저장소에 파일이 존재하게 된 후 해야할 일!
	//파일명을 개발자가 정한 규칙으로 변경해야 한다..현재시간의 밀리세컨드까지 구해보자!
	long time = System.currentTimeMillis();
	//out.print(time);
	//구한 시간에 확장자를 붙이면 최종적으로 절대 중복되지않는 파일이 생성
	String filename = multi.getOriginalFileName("photo");
	//out.print("전송한 파일의 이름은 " + filename);
	String ext = FileManager.getExtend(filename);
	out.print("내가 조작한 파일명은 " + time + "." + ext);
	
	//조작한 이름으로 파일명을 바꾸어야함
	//결국 파일을 다루어야 하므로 javaSE의 File클래스를 이용하면 된다!
	File file = multi.getFile("photo");
	file.renameTo(new File("C:/workspace/javaee_workspace/BoardApp/WebContent/data/"+time+"."+ext));
	
	//클라이언트에게 전송할 응답정보를 가진 객체
	//클라이언트의 브라우저로 하여금 지정한 URL로 재접속을 시도하게 만듦
	response.sendRedirect("/gallery/send.html");
} catch (IOException e) {
	e.printStackTrace();//콘솔로그에 에러 출력
	out.print("업로드 용량이 너무 큽니다..");//사블릿 쓰레드 에러..
}
%>

위 코드에서 볼 수 있듯이  MultipartRequest와 request 객체를 이용해서 파일을 업로드할 수 있다.

다운받은 파일에 doc폴더 아래에 html파일들을 보면서 자세히 알 수 있다.

Apache에서 제공하는 라이브러리 사용

Maven Repository: commons-fileupload » commons-fileupload (mvnrepository.com)

 

Maven Repository: commons-fileupload » commons-fileupload

The Apache Commons FileUpload component provides a simple yet flexible means of adding support for multipart file upload functionality to servlets and web applications. VersionRepositoryUsagesDate1.4.x1.4Central226Dec, 20181.3.x1.3.3Central514Jun, 20171.3.

mvnrepository.com

위 사이트에서 jar파일을 다운받아 라이브러리에 등록한다.

<%@page import="org.apache.catalina.filters.SetCharacterEncodingFilter"%>
<%@page import="common.FileManager"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.DefaultFileItemFactory"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
	/*
파일 업로드 컴포넌트 종류엔 여러종류가 있지만, 그 중 아파치의 공식 업로드 컴포넌트를 사용해본다.
*/
//업로드 객체를 생성해주는 팩토리 객체 : 주로 설정을 담당(서버의 저장경로, 파일의 용량제한..)
String saveDir = "C:/workspace/javaee_workspace/BoardApp/WebContent/data";
int maxSize = 1024 * 1024 * 3; // 3MB
DefaultFileItemFactory itemFactory = new DefaultFileItemFactory();
itemFactory.setRepository(new File(saveDir)); //저장될 위치!, 물리적인 저장이 아닌, 임시 디렉터리
//디렉터리도 파일의 종류 중 하나이다!!
itemFactory.setSizeThreshold(maxSize);//파일 크기 제한

//이 객체가 실제 업로드를 수행함
ServletFileUpload upload = new ServletFileUpload(itemFactory);//설정정보를 생성자의 인수로 전달!!

//FileItem은 클라이언트의 [전송 정보 하나 하나]를 의미한다!! 즉, html에서의 input, file 컴포넌트 들을..
//우리의 경우 input type="text"가 FileItem에 담기고
//우리의 경우 input type="file"도 FileItem에 담긴다.
List<FileItem> items = upload.parseRequest(request);//request를 전달하여 upload컴포넌트에게 클라이언트의 요청정보를 전달!!

for (FileItem item : items) {
	//out.print(item.getFieldName());//컴포넌트의 name추출 
	//반복문으로 처리되다보니, 파일만 따로 처리를 하려면 구분로직이 필요함..
	//out.print(item.getFieldName()+"은 텍스트 박스 여부 " + item.isFormField()+"<br>");
	
	if (!item.isFormField()) {//type이 text가 아닌 것만 업로드 처리!
		//out.print(item.getFieldName()+"의 값은 "+item.getString()+"<br>");
		//업로드 처리하자!! 메모리상의 이미지 정보를 실제 물리적 파일로 저장하자!
		//out.print( item.getName());
		String ext = FileManager.getExtend(item.getName());
		String filename = System.currentTimeMillis() + "." +ext;
		File file = new File(saveDir+"/"+filename);//비어있는 파일
		item.write(file);//저장 정보를 File클래스의 인스턴스로 전달!!
		out.print("보고서 작성<br>");
		out.print("본래 파일명 : "+item.getName()+"<br>");
		out.print("변경 파일명 : "+filename+"<br>");
		out.print("저장 위치 : "+saveDir+"<br>");
		out.print("파일 크기 : "+item.getSize()+"<br>");
	}
}
%>

아파치에서 제공하는 라이브러리는 Factory객체를 이용하여 설정을 할 수 있고 ServletFileUpload 객체를 이용하여 request내에 담긴 파라미터들을 해석하여 List로 받아 사용할 수 있다.!!

'프로그래밍 > JSP' 카테고리의 다른 글

JSP | session  (0) 2020.12.16
JSP | 커넥션풀(Connection Pool)  (0) 2020.12.11
JSP | MyBatis 사용해보기  (0) 2020.12.10
JSP - 페이징 이해  (0) 2020.12.08
JSP - JSP(Java Server Page)란?  (0) 2020.12.01

+ Recent posts