[JAVA] MultipartRequest File Upload

 

파일업로드를 하기 위해서는  oreilly.jar 를 먼저 다운받는다.

그리고 CLASSPATH 환경변수에 넣어둔다 (예: %CATALINA_HOME%\lib\oreilly.jar)

 

1. 클라이언트 단(Ajax)

<form method="post" action="/upload_test.do" enctype="multipart/form-data">
    제목: <input type="text" name="title">
    파일: <input type="file" name="upfile">
    <input type="submit" value="Upload">
</form>

2. 백엔드 단(java)

package com.file;
 
import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
 
public class Upload extends HttpServlet {
 
    /*@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        process(req, resp);
    }*/
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        process(req, resp);
        
    }
    //처리내용
    protected void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        
        String fsl = File.separator;
 
        // 30Mbyte 제한
        int maxSize  = 1024*1024*30;   
        // 웹서버 컨테이너 경로
        String root = req.getSession().getServletContext().getRealPath(fsl);
        // 파일 저장 경로
        String rootPath = root + "Uploads" + fsl;
        // 업로드 파일명
        String uploadFile = "";
        // 실제 저장할 파일명
        String newFileName = "";
 
        int read = 0;
        byte[] buf = new byte[1024];
        FileInputStream fin = null;
        FileOutputStream fout = null;
        long currentTime = System.currentTimeMillis();  
        SimpleDateFormat simDf = new SimpleDateFormat("yyyyMMddHHmmss");  
     
        try{
            MultipartRequest multi = new MultipartRequest(req, rootPath, maxSize, "UTF-8", new DefaultFileRenamePolicy());
                         
            // 전송받은 parameter의 한글깨짐 방지
            String title= multi.getParameter("title");
            title= new String(savePath.getBytes("8859_1"), "UTF-8"); 
            
            // 파일업로드
            uploadFile = multi.getFilesystemName("upfile");
 
            // 실제 저장할 파일명(ex : 20140819151221.zip)
            newFileName = simDf.format(new Date(currentTime)) +"."+ uploadFile.substring(uploadFile.lastIndexOf(".")+1);     
            
            // 업로드된 파일 객체 생성
            File oldFile = new File(rootPath + uploadFile);     
             
            // 실제 저장될 파일 객체 생성
            File newFile = new File(rootPath + newFileName);             
     
            // 파일명 rename
            if(!oldFile.renameTo(newFile)){     
                //rename이 되지 않을경우 강제로 파일을 복사하고 기존파일은 삭제     
                buf = new byte[1024];
                fin = new FileInputStream(oldFile);
                fout = new FileOutputStream(newFile);
                read = 0;
                while((read=fin.read(buf,0,buf.length))!=-1){
                    fout.write(buf, 0, read);
                }
                 
                fin.close();
                fout.close();
                oldFile.delete();
            }   
     
        }catch(Exception e){
            e.printStackTrace();
        }
 
    
    }
    
}

 

+ Recent posts