jsp 에서 파일 업로드

essential·2023년 8월 8일
0

JSP

목록 보기
20/21

파일 업로드의 원리

  • enctype 속성을 multipart/form-data로 설정
<form method=”post” enctype=”mutipart/form-data”>
  <input type=”file” name=”filename”>
</form>
  • 이 타입을 지정하지 않으면 파일 선택 박스에서 선택된 파일 객체가
    전송되는 것이 아니고 파일이름만 문자열 형태로 서버로 전송되기 때문에 업로드 기능을 제대로 구현할 수 없다.
  • COS 라이브러리를 이용하여 파일 업로드를 구현

COS 다운 받아서 JSP 에서 사용하기

  • 다운 받은 파일 압축 풀고 cos.jar 파일을 WEB-INF/lib 폴더에 배치해준다. (외부 라이브러리 쓸 때 이렇게 사용하면 됨)

MultipartRequest의 특징

  • COS 라이브러리에서 가장 핵심적인 역할을 하는 클래스
  • 파일 업로드를 직접적으로 담당

MultipartRequest의 생성자

MultipartRequest(javax,servlet,http,HttpServletRequest request,
								java.lang.String saveDirectory,
								int maxPostSize,
								java.lang.String encoding,
								FileRenamePolicy, policy)
인자설명
requestMultipartRequest와 연결될 request 객체를 의미한다.
saveDirectory서버 측에 파일이 실질적으로 저장될 경로를 의미한다.
maxPostsize한번에 업로드 할 수 있는 최대 파일 크기를 의미한다.
encoding파일의 인코딩 방식을 의미한다.
policy파일 이름 중복 처리를 위한 인자를 의미한다.

MultipartRequest의 메소드

메소드설명
getParameterNames()폼에서 전송된 파라미터의 타입이 file이 아닌 이름들을 Enumeration 타입으로 리턴 한다.
getParameterValues()폼에서 전송된 파라미터 값들을 배열로 받아 온다.
getParameter()Request 객체에 있는 해당 파라미터의 값을 가져온다.
getFileNames()파일을 여러 개 업로드 할 경우 타입이 file인 파라미터 이름들을 Enumeration 타입으로 리턴 한다.
getFilesystemName()서버에 실제로 업로드 된 파일의 이름을 의미한다.
getOriginalFileName()클라이언트가 업로드 한 파일의 원본 이름을 의미한다.
getContentType업로드 된 파일의 컨텐트 타입을 얻을 때 사용한다.
getFile서버에 업로드 된 파일 객체 자체를 반환하는 메소드이다.

파일 업로드 폼

예제

fileUploadForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>FileUpload Form</title>
</head>
<body>
<center>
<form action="fileUpload.jsp" method="post" enctype="multipart/form-data">
<table border=1>
	<tr>
		<td colspan=2 align=center><h3>파일 업로드 폼</h3></td>
	<tr>
		<td>올린 사람 : </td>
		<td><input type="text" name="name"></td><br>
	</tr>
	<tr>
		<td>제목 : </td>
		<td><input type="text" name="name"></td><br>
	</tr>
	<tr>
		<td>파일명1 : </td>
		<td><input type="file" name="filename1"></td><p/>
	</tr>
	<tr>
		<td>파일명2 : </td>
		<td><input type="file" name="filename2"></td>
	</tr>
	<tr>
		<td colspan=2 align=center><input type="submit" value="전송"></td>
	</tr>
</table>
</form>
</center>
</body>
</html>

fileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page import="java.util.*"%>
<% 
	String uploadPath="C\\Project\\upload"; //절대 경로 (외부에)

	int size= 10*1024*1024;
	String name="";
	String subject="";
	String filename1="";
	String filename2="";
	String origfilename1="";
	String origfilename2="";
	
	try{
		MultipartRequest multi=new MultipartRequest(request, // 파일 업로드가 일어남(생성자)
							uploadPath, 
							size,
							"utf-8",
							new DefaultFileRenamePolicy()); 
	name=multi.getParameter("name"); // 입력된 값 읽어옴
	subject=multi.getParameter("subject");
	
	Enumeration files=multi.getFileNames(); //열거형으로 저장
	
	String file1=(String)files.nextElement(); //첫번째 파일 읽어옴
	filename1=multi.getFilesystemName(file1); //서버에 저장된 파일명
	origfilename1=multi.getOriginalFileName(file1); //원본 파일 명
	
	String file2=(String)files.nextElement(); //두번째 파일 읽어옴
	filename2=multi.getFilesystemName(file2);
	origfilename2=multi.getOriginalFileName(file2);
	
	}catch(Exception e){
		e.printStackTrace();
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fileUpload Form</title>
</head>
<body>
<form name="filecheck" action="fileCheck.jsp" method="post">
	<input type="hidden" name="name" valu="<%=name %>">
	<input type="hidden" name="name" valu="<%=subject %>">
	<input type="hidden" name="name" valu="<%=filename1 %>">
	<input type="hidden" name="name" valu="<%=filename2 %>">
	<input type="hidden" name="name" valu="<%=origfilename1 %>">
	<input type="hidden" name="name" valu="<%=origfilename2 %>">
</form>
<a href="#" onclick="javascript:filecheck.submit()">업로드 확인 및 다운로드 페이지 이동</a>
</body>
</html>

file_down.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.io.File" %>
<%@page import="java.io.*" %>
<%@page import="com.oreilly.servlet.ServletUtils"%>
<%
	String fileName=request.getParameter("file_name");
	String sDownloadPath="C:\\Project\\upload";
	String sFilePath = sDownloadPath + "\\" + fileName; //실제 위치
	
	byte b[] = new byte[4096];
	File oFile = new File(sFilePath); //파일 객체 생성
	
	FileInputStream in = new FileInputStream(sFilePath);
	
	String sMimeType = getServletContext().getMimeType(sFilePath);
	// octet-stream은 8비트로 된 일련의 데이터를 뜻한다. 지정되지 않은 파일 형식을 의미
	if(sMimeType == null)
		sMimeType ="application/octet-stream";
	
	response.setContentType(sMimeType);
	
	//한글 업로드 ( 이 부분이 한글 파일명이 깨지는 것을 방지 해준다.)
	String sEncoding = new String(fileName.getBytes("utf-8"),"8859_1");
	response.setHeader("Content-Disposition", "attachment; filename= "+sEncoding);
	
	ServletOutputStream out2 = response.getOutputStream();
	int numRead;
	//바이트 배열의 b의 0번 부터 numRead번 까지 브라우저로 출력
	while((numRead = in.read(b, 0, b.length)) != -1){ // 0번째부터 length 까지 읽고 b에 저장
		//-1 은 파일 끝에 다다르면 -1에 도달해서 
		out2.write(b, 0, numRead); //서버에서 클라이언트로 출력
	}
	out2.flush(); // 출력 객체 비움
	out2.close();
	in.close();

%>
profile
essential

0개의 댓글