JSP-파일 업로드(Cos.jar)

임재헌·2023년 4월 25일
0

JSP

목록 보기
30/33

파일 전송 원리

  • 폼에 enctype='multipart/form-data'가 추가

  • enctype이 폼에 추가가 되면 기본적으로 request에 값을 담을수 없다.

  • 업로드된 파일저장
    . 데이터베이스에는 저장시키지 않는다
    . DB에는 업로드 된 파일명과 확장명, 파일크기정도만 저장을 시키고,
    실제 파일은 웹서버의 하드디스크에 저장을 시킨다.

  • 전송된 File 저장(jakarta FileUpload API, 파일 업로드)

  • 파일 전송 원리

    파일 ---> Web Browser ---> 전송 ---> Tomcat ---> 디스크에 저장 (파일)
    ---> DB에 저장(파일관련 속성)

FileItem Interface가 제공하는 메소드 내역

. boolean isFormField(): 일반적인 입력 파라미터인 경우 true를 리턴 합니다.
. String getFieldName(): 파라미터의 이름을 구합니다.
. String getString() : 기본 캐릭터셋을 이용하여 파라미터의 값을 구합니다.
. String getString(String encoding): 지정한 인코딩을 이용하여 파라미터값을 구함
. String getName() : 업로한 파일의 전체 경로를 포함한 이름을 구합니다.
. long getSize() : 업로드한 파일의 크기를 구합니다.
. void write(File file): 업로드한 파일을 file이 나타내는 파일로 저장합니다.
. InputStream getInputStream(): 업로드한 파일을 읽어오는 입력 스트림을 리턴합니다.
. byte[] get() : 업로드한 파일을 byte 배열로 구합니다.
. boolean isInMemory() : 업로드한 파일이 임시 디렉토리에 저장된 상태인 경우
true를 리턴하고, 임시 데렉토리에 저장된 경우 false를 리턴합니다.
. void delete() : 파일과 관련된 자원을 제거합니다.메모리가 사용되고
있을 경우 메모리를 반환하고, 임시 디렉토리에 있는 파일을 삭제합니다.

참조: http://www.servlets.com
TOMCAT 10버전에서는 에러가 발생해서
TOMCAT 9버전을 설치해서 테스트 한다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>uploadtest</title>
</head>
<body>
<h3>파일 첨부 테스트</h3>
<form method="post" action="uploadtestProc.jsp">
		이름: <input type="text" name="uname"> <br> 
		제목: <input type="text"	name="subject"> <br> 
		내용:<textarea rows="5" cols="20" name="content"></textarea>
		<br>
		첨부:<input type="file" name="filenm"><br>
		<input type="submit" value="전송"><br>
		



	</form>

</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>uploadtestProc</title>
</head>
<body>
<h3> 파일 첨부 테스트 결과</h3>
<%
	request.setCharacterEncoding("UTF-8");
 	out.print(request.getParameter("uname"));
 	out.print("<hr>");
 	out.print(request.getParameter("subject"));
 	out.print("<hr>");
 	out.print(request.getParameter("content"));
 	out.print("<hr>");
 	out.print(request.getParameter("filenm"));
 	out.print("<hr>");
%>

</body>
</html>

enctype="multipart/form-data"
문자열 정보와 파일도 동시에 전송

enctype="multipart/form-data"속성이 폼에 추가되면
request 내장 객체가 가지고 있는 값을 가져올 수 없다
request.getParameter("") null 출력

1.첨부된 파일 저장하기
 	//	src/main/webapp/strage
 	*/ 	
 	//실제 물리적인 경로
 	try{
 	String saveDirectory=application.getRealPath("/storage");
 	//out.print(saveDirectory);
 	
 	// D:\202301\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\myweb\storage
 	
 	//최대 저장 용량(10M)
 	int maxPostSize=1024*1024*10;
 	
 	//한글 인코딩
 	String encoding="UTF-8";
 	
 	MultipartRequest mr=new MultipartRequest(request,saveDirectory,maxPostSize,encoding,new DefaultFileRenamePolicy());

//2. mr참조변수가 가리키고 있는 텍스트 
out.print("<hr>");
out.print(mr.getParameter("uname"));
out.print("<hr>");
out.print(mr.getParameter("subject"));
out.print("<hr>");
out.print(mr.getParameter("content"));
out.print("<hr>");


		3. /storage폴더에 저장된 파일정보 확인하기
			//1.mr에서 <input type=file> 전부 수거 	 	
 			//열거형 Enumeration enum={"KIM","LEE","PARK"}
			//첨부파일이 3개 ->files={<input type=file>,<input type=file>,<input type=file>}
			Enumeration files= mr.getFileNames();
			
			//2. files가 가지고 있는 값들 중에서 개별적으로 접근하기 위해 name 가져오기
				//첨부 :<input type=file name=filenm>
			String item=(String)files.nextElement();	//filenm
			
			//3. item이름 (filenm)이 가지고 있는 실제파일을 mr객체에서 가져오기
			String ofileName=mr.getOriginalFileName(item);
			out.print("원본 파일명:"+ ofileName);
			out.print("<hr>");
			
			String fileName=mr.getFilesystemName(item);
			out.print("리네임 파일명: "+fileName);
			out.print("<hr>");
			
			//4. storage 폴더에 저장된 파일의 기타 정보 확인하기
			File file =mr.getFile(item);
			if(file.exists()){
				out.print("원본 파일명:"+ file.getName());
				out.print("<hr>");
				out.print("원본 파일명:"+ file.length()+"byte");
				out.print("<hr>");
				
			}else{
				out.print("파일 존재하지 않음");
			}
			

0개의 댓글