파일 업로드의 원리
<form method=”post” enctype=”mutipart/form-data”>
<input type=”file” name=”filename”>
</form>
COS 다운 받아서 JSP 에서 사용하기
MultipartRequest의 특징
MultipartRequest의 생성자
MultipartRequest(javax,servlet,http,HttpServletRequest request,
java.lang.String saveDirectory,
int maxPostSize,
java.lang.String encoding,
FileRenamePolicy, policy)
인자 | 설명 |
---|---|
request | MultipartRequest와 연결될 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();
%>