서블릿 API 3.0 을 이용한 java 파일 업로드

2014. 9. 2. 14:57공부/JAVA

텍스트 파일을 ajax로 업로드 하고, 그 파일을 분석해서 사용자 인터페이스를 구성해야 하는 내용이 있어서

오랜만에 파일 업로드 구현...

servlet api 3.0 이후부터는 좀 편하게 구현이 가능해짐...

원 소스코드는 아래 URL에서 구해옴..

거의 수정한 거 없음 ㅠㅠ, 다만 ajax response 로 수정


http://www.codejava.net/java-ee/servlet/java-file-upload-example-with-servlet-30-api



HTML FORM ( jquery 가 필요합니다. )


<form id="uploadForm" enctype="multipart/form-data">

  <input type="file" id="fileId1" name="file1" value="VND 파일선택"/>

  <input type="file" id="fileId2" name="file2" value="Config 파일 선택"/>

</form>

<button id="btn-upload">file upload</button>


<script type="text/javascript">

$('#btn-upload').click( function () {

var form = new FormData(document.getElementById('uploadForm'));

        $.ajax({

    url: "/nfv/ajax/vnfCatalog/file/upload",

    data: form,

      dataType: 'text',

      processData: false,

      contentType: false,

      type: 'POST',

      success: function (response) {

// more action

      },

      error: function ( request, status, error ) {

        alert( request.responseText );

      }

    });

});

</script>




서버사이드 ( 서블릿 API 3.0 / 톰캣 7.0 / java 1.6 이상이 필요 )


import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

 

import java.util.logging.Logger;


import javax.servlet.ServletException;

import javax.servlet.annotation.MultipartConfig;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.Part;


import org.apache.tomcat.util.http.fileupload.FileUploadBase.SizeLimitExceededException;


import com.sun.jersey.api.client.ClientResponse;

 

@WebServlet("/file/upload")

@MultipartConfig(fileSizeThreshold=1024*1024*2, maxFileSize=1024*1024*5, maxRequestSize=1024*1024*10 )

public class FileUploadController extends HttpServlet {

 

    private static final long serialVersionUID = 1L;

    private static final int MAX_FILE_SIZE = 5; 

private static final String SAVE_DIR = "uploadFiles";

private static final Logger LOGGER = Logger.getLogger(ClientResponse.class.getName()); 

    

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException 

    {

    // ajax 로 받은 데이터 중 한글이 깨지는 것 방지

    response.setContentType("text/html; charset=utf-8");

   

    String msg = "파일 업로드 중 정의되지 않은 오류가 발생했습니다. 관리자에게 문의 바랍니다.";

   

    // 어플리케이션 절대경로 받아옴

    String appPath = request.getServletContext().getRealPath("");

        LOGGER.info( "appPath : " + appPath );

        

        // 저장할 디렉토리 패쓰 설정

        String savePath = appPath + File.separator + SAVE_DIR;

        LOGGER.info( "savePath : " + savePath );

        

                

        

    try

    {

       // 저장할 디렉토리가 없으면 새로 만듦

       File fileSaveDir = new File(savePath);

       if (!fileSaveDir.exists()) fileSaveDir.mkdir();

       

       // file 구분해서 write

       for (Part part : request.getParts()) {

           String fileName = extractFileName(part);

           part.write(savePath + File.separator + fileName);

       }

       

       response.getWriter().print( "전송이 완료되었습니다." );

    }

    catch ( Exception e )

    {

    LOGGER.warning( e.toString() );

    response.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );

   

    if ( e.getCause() instanceof FileNotFoundException )

    {

    msg = "업로드할 파일을 선택해 주십시요.";

    LOGGER.warning( msg );

    response.getWriter().write( msg );

    }

    else if ( e.getCause() instanceof SizeLimitExceededException )

    {

    msg = "업로드한 파일이 업로드 한계 사이즈 [" + MAX_FILE_SIZE + "MB] 를 초과합니다.";

    LOGGER.warning( msg );

    response.getWriter().write( msg );

    }

    else

    {

    msg = "파일 업로드 중 정의되지 않은 오류가 발생했습니다. 관리자에게 문의 바랍니다.";

    LOGGER.warning( msg );

    response.getWriter().write( msg );

    }

   

    response.flushBuffer();

    }

        

    }

 

    /**

     * HTTP 헤더에서 파일명을 분리합니다.

     */

    private String extractFileName(Part part) 

    {

        String contentDisp = part.getHeader("content-disposition");

        String[] items = contentDisp.split(";");

        for (String s : items) 

        {

            if (s.trim().startsWith("filename")) 

            {

                return s.substring(s.indexOf("=") + 2, s.length()-1);

            }

        }

        return "";

    }

}


나중에 또 쓸거 같아서 만들어 놓음