본문 바로가기
HTML

48일차//JSP// FileItem 인터페이스 ( 자료실 파일 업로드, 올리기)💨

by aesup 2021. 3. 22.
728x90

사진에 올리기 버튼 클릭시 pdsupload.jsp로 action

org.apache.tomcat.util.http.fileupload.FileItem 인터페이스

 

FileItem 인터페이스는 multipart/form-data 형식으로 전송된 폼 데이터를 파일 또는 폼 아이템으로 표현하는 객체입니다.

<form action="pdsupload.jsp" method = "post" 
enctype = "multipart/form-data">
<%@page import="dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
       <%
Object ologin = session.getAttribute("login");
MemberDto mem = null;
if(ologin == null){
	%>	
	<script>
	alert('로그인 해 주십시오');
	location.href = "login.jsp";
	</script>	
	<%
}
mem = (MemberDto)ologin;
%>
    <%
  		//file 명 변경
  		//String fillename = (new Date().getTime()) + "";
      //System.out.println(fillename);
     	//mydata.txt - > 161616161.txt
     	//original filename = mydata.txt
      // file name = 161616161.txt
     
    
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

</head>
<body>
<h2>자료 올리기 </h2>
<div align = "center">

<form action="pdsupload.jsp" method = "post" 
enctype = "multipart/form-data">

<table border = "1">
	<col width = "200"><col width = "500">
	<tr>
		<th>아이디</th>
		<td>
		<input type="text" name = "id" value = "<%=mem.getId()%>" readonly="readonly">
		</td>
	</tr>
	
	<tr>
		<th>파일 업로드</th>
		<td>
			<input type="file" name = "fileload" style="width:400px">
		</td>
	
	</tr>
	
	<tr>
		<th>타이틀</th>
		<td>
			<input type="text" name = "title">
		</td>
	
	</tr>
	
	
	<tr>
		<th>내용</th>
		<td>
			<textarea rows="20" cols="50" name = "content"></textarea>
		</td>
	
	</tr>
	
	<tr align = "center">
		<td colspan="2">
		<input type="submit" value = "올리기">
		</td>
	
	</tr>
	

</table>

</form>


</div>

</body>
</html>

 

 

FileItem 인터페이스 메소드

void delete() : 임시 디렉토리에 있는 임시 파일을 삭제합니다.

 

byte[] get() : 파일 아이템을 byte 배열로 반환합니다. 

 

java.lang.String getContentType() : 콘텐츠 타입을 반환합니다.  

 

java.lang.String getFiledName() : 필드 이름을 반환합니다. input 태그의 name 속성의 값을 반환합니다. 

 

java.lang.String getName()

클라이언트에 저장되어 있던 파일의 이름을 반환합니다. 반환된 이름은 경로와 파일명이 모두 있는 파일명입니다.  

 

long getSize() : 파일의 사이즈를 반환합니다. 

 

java.lang.String getString() : 기본 문자셋으로 파일 아이템 내용을 반환합니다. 

java.lang.String getString(java.lang.String encoding)

지정한 인코딩으로 파일 아이템 내용을 반환합니다. 이 경우는 파일의 내용이기 때문에 텍스트 파일이 한글로 작성된 경우에나 사용합니다.

 

boolean isFormField() : 일반 파라미터인지 여부를 반환합니다. 일반 파라미터일 경우 true를 반환합니다. 

 

boolean isInMemoey() : 메모리에만 있는지 여부를 반환합니다.

 

void wirte(java.io.File file) : 업로드 된 파일을 디스크에 저장합니다.  

 

 

 

 

예 제

pdswrite.jsp에서 form action으로 -> pdsupload.jsp에 전송

<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="dto.PdsDto"%>
<%@page import="dao.PdsDao"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="java.io.File"%>
<%@page import="java.io.IOException"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%!
/* 업로드에 필요한것들 2가지 */
// upload 함수
public String processUploadFile(FileItem fileItem, String newfilename, String dir)throws IOException{

	String filename = fileItem.getName();	// 경로 + 파일명
	//중복방지를 위해 파일명을 변경해준다.
	
	
	
	
	long sizeInBytes = fileItem.getSize();
	
	if(sizeInBytes > 0){	// 파일이 정상?		// d:\\tmp\\abc.txt d:/tmp/abc.txt 
		//파일사이즈가 존재할떄
		
		
		//1
		// \\혹은 /를 빼고 마지막번찌부터 파일명 + 확장자명이 있기 때문
		int idx = filename.lastIndexOf("\\"); 
		if(idx == -1){
			idx = filename.lastIndexOf("/");
		}
		
		
		//2
		//파일 이름은 \\,/가 마지막으로 나온 인덱스에서 +1를 추가하였다
		
		filename = filename.substring(idx + 1);
		//File uploadFile = new File(dir, filename);
		//새로운파일명
		File uploadFile = new File(dir, newfilename);
		//명칭을 바꾸어 업로드
		//기존의 파일이 아닌 날짜형식으로 파일을 변경하여 업로드
		try{	
			fileItem.write(uploadFile);		// 실제 upload되는 부분
		}catch(Exception e){
			e.printStackTrace();
		}		
	}
	return filename;	// DB에 저장하기 위한 return;
}
%>


    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
// tomcat 배포 - server
String fupload = application.getRealPath("/upload");

// 지정 폴더 - client
// String fupload = "d:\\tmp";

System.out.println("업로드 폴더:" + fupload);

String yourTempDir = fupload;


//업로드제한용량
//업로드 용량
int yourMaxRequestSize = 100 * 1024 * 1024;	// 1 Mbyte
int yourMaxMemorySize = 100 * 1024;			// 1 Kbyte



// form field의 데이터를 저장할 변수
String id = "";
String title = "";
String content = "";

// file명 저장
String filename = "";
String newfilename = "";
//이걸 새로운 파일이라 생각

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart == true){
	
	// FileItem 생성
	DiskFileItemFactory factory = new DiskFileItemFactory();
	
	factory.setSizeThreshold(yourMaxMemorySize);
	factory.setRepository(new File(yourTempDir));
    
    //DiskFileItemFactory클래스는 업로드 파일의 크기가 지정한 크기를 넘기 전까지는 업로드
    //한 파일 데이터를 메모리에 저장하고 지정한 크기를 넘길 경우 임시 디렉터리에 파일로 저장
	
    //setSizeThreshold(int sizeThreshold) : 메모리에 저장할 수있는 최대 크기.단위는 바이트이다. 
    //기본값은 10240바이트(10kb)

	//setRepository(File repository) : 메모리 저장 최대 크기를 넘길 경우 파일을 생성할
    //디렉터리를 지정. 지정하지 않을 경우 시스템의 기본 임시 디렉터리를 사용.( System.getProperty("java.io.tmpdir") 로 기본임시 디렉터리를 구할 수 있음 )
    //파일 업로드 경로 지정..
    
	//업로드요청 처리 객체
	ServletFileUpload upload = new ServletFileUpload(factory);
	upload.setSizeMax(yourMaxRequestSize);
	
	List<FileItem> items = upload.parseRequest(request);
    //이전 폼(pdswrite)에서 전송된 request를 parsing하여 아이템들을 추출한다

	Iterator<FileItem> it = items.iterator();
    //Iterator : 집합체의 정보를 얻음. hasNext(), next(), remove()
	
	while(it.hasNext()){
		
		FileItem item = it.next();
		
		if(item.isFormField()){	// id, title, content
			if(item.getFieldName().equals("id")){
				id = item.getString("utf-8");
			}
			else if(item.getFieldName().equals("title")){
				title = item.getString("utf-8");
			}
			else if(item.getFieldName().equals("content")){
				content = item.getString("utf-8");
			}			
		}
		else{	// file
			if(item.getFieldName().equals("fileload")){
				
				//확장자명
				String fileName = item.getName();
				int lastInNum = fileName.lastIndexOf(".");
				
				//본래파일에서 확장자명만 가져온다 ex) .png
				String exName = fileName.substring(lastInNum);
				
				//새로운 파일명
				newfilename = (new Date().getTime()) + "" + exName;
				filename = processUploadFile(item, newfilename, fupload);
				
				System.out.println("newfilename = "+ newfilename);
				//filename이 원본이름
				//newfilename 수정한 이름
			}
		}		
	}	
}

// DB에 저장
PdsDao dao = PdsDao.getInstance();
boolean isS = dao.writePds(new PdsDto(id, title, content, filename, newfilename ));
if(isS){
	%>
	<script type="text/javascript">
	alert('파일 업로드 성공');
	location.href = "pdslist.jsp";
	</script>
	<%
}else{
	%>
	<script type="text/javascript">
	alert('파일 업로드 실패');
	location.href = "pdswrite.jsp";
	</script>
	<%
}
%>

</body>
</html>








FileItem item = (FileItem)itemCollection.next();


fileName = item.getName();
// 이때 파일 이름은 경로를 포함한 전체 파일명입니다. 따라서 경로를 제거해 주어야 합니다. 
fileStream = item.getInputStream();
    
//**********************************************************
System.out.println("콘텐츠 타입 : " + item.getContentType() );
System.out.println("업로드 파일 이름 : " + item.getName() );
System.out.println("필드 이름 : " + item.getFieldName() );
System.out.println("파일 사이즈 : " + item.getSize() );
System.out.println("메모리 여부 : " + item.isInMemory());
 //**********************************************************

 

 

[ 결 과 ] 

콘텐츠 타입 : image/gif
업로드 파일 이름 : D:\temp\photo2.gif
필드 이름 : person
파일 사이즈 : 9732
메모리 여부 : true 

 

 

 

파일 저장하기

File uploadFile = new File();

item.write( uploadFile );

 

파일 읽기

InputStream uploadStream = item.getInputStream();

...

uploadStream.close();

 

 

 

 

 

임시로 저장한 파일 자동으로 지우기

 

파일을 처리하기 전에 임시로 저장하고 임시로 저장한 파일을 지우기 위한 방법입니다. (org.apache.commons.io.FileCleaner Class) 하지만 이런 처리를 하지 않아도 파일을 사용하지 않으면 자동으로 임시 폴더의 파일을 지워버립니다.

web.xml 수정

<listener>

    <listener-class>

        org.apache.commons.fileupload.servlet.FileCleanerCleanup

    </listener-class>

</listener>

 

DiskFileItemFactory 생성

public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context, File repository) {

    FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(context);

    return new DiskFileItemFactory(fileCleaningTracker, DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, repository);

}

728x90