로컬의 화일을 서버에 업로드 하는 간단 예제입니다.
여기서는 multipart 처리를 위해 oreilly의 팩키지를 이용 했습니다.
(이외에도 자카르다프로젝트나 스트럿츠의 경우 자체 업로드를 지원 합니다.)
import com.oreilly.servlet.MultipartRequest;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Upload extends HttpServlet {
int maxsize = 5*1024*1024; //업로드제한 화일사이즈
final String Path = "/upload/"; //업로드된 화일이 저장 될 디렉토리
String fname; //업로드된 화일이름
String cname; //실제 저장될 화일이름
MultipartRequest multi; //텍스트와 바이너리를 받을 객체 선언
//service로 구현할 경우 post, get방식 둘다 지원
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html;charset=euc-kr");
PrintWriter out = res.getWriter();
/* 한글이 깨질경우 사용
PrintWriter out = new PrintWriter(
new OutputStreamWriter(res.getOutputStream(), "euc-kr"),true);
*/
ServletContext request = getServletContext(); //servletContext객체생성
String rootPath = request.getRealPath("/") + Path; //upload 디렉토리 세팅
try {
multi = new MultipartRequest(req, rootPath, maxsize);
Enumeration file = multi.getFileNames(); //업로드된 파일들의 이름리턴
while(file.hasMoreElements()) {
String ename = (String)file.nextElement();
fname = multi.getFilesystemName(ename); //파일이름리턴
cname = ""+System.currentTimeMillis();
File f = multi.getFile(fname); //파일객체리턴
java.io.File up1 = new java.io.File(rootPath+fname);
java.io.File up2 = new java.io.File(rootPath+cname); //동일화일 업로드시 overwrite를 막기위해 이름을 유니크하게 바꾸어 준다.
if (up1.exists()){
boolean rslt = up1.renameTo(up2);
}
}
}
catch(Exception e) { e.printStackTrace(); }
//여기서는 파일저장후 화일명 및 텍스터에 관련된 파라미터값을 가져온다.
String name = multi.getParameter("name");
String title = multi.getParameter("title");
String content = multi.getParameter("content");
String filename = fname;
String filecname = cname;
//위에 파라미터 값을 바탕으로 DB에 데이터 처리를 아래에 구현하면 된다.
.......... DB 데이터 처리 생략.............
}
}