본문 바로가기

IT Data/#Java

Javascript MultipartRequest 생성자와 메소드

원문 출처 : http://e2xist.tistory.com/233


○ 파일 업로드

1) 기본 설정

- 파일 업로드 컴포넌트 중 현재 가장 인정 받는 cos패키지의 MultipartRequest를 사용하여 파일 업로드 기능을 구현한다.

1. cos파일 다운받기

http://www.servlets.com>왼쪽메뉴 com.oreilly.sevlte>cos-05Nov2002.zip다운

2. 파일 복사

- cos-05Nov2002.zip>lib>cos.jar 파일을 복사한다.

3. 파일 설치

① 다이나믹웹프로젝트>WEB-INF>lib안에 cos.jar파일을 import받는다.(오른쪽 마우스)

② 톰캣 홈>commons>lib안에 cos.jar파일을 붙여 넣는다.

2) MultipartRequest 생성자

- MultipartRequest의 객체가 생성됨과 동시에 파일 업로드가 이루어 진다.

생성자

설명

MutipartRequest
(HttPServletRequest request, String saveDirectory)

디렉토리를 지정할  있으며기본적으로 업로드 용량은 1메가로 제한된다

MutipartRequest
(HttPServletRequest request, String saveDirectory, int maxPostSize)

파일을 저장할 디렉토리를 지정할  있으며업로드제한 용량을 설정할  있다.(바이트단위). 이때 업로드 제한 용량을 넘어서 업로드를 시도하면 IOException 발생

MutipartRequest
(HttPServletRequest request, String saveDirectory, int maxPostSize, FileRenamePolicy policy)

파일을 저장할 디렉토리를 지정할  있으며업로드제한 용량을 설정할  있다.(바이트단위). 이때 업로드 제한 용량을 넘어서 업로드를 시도하면 IOException 발생된다또한 중복 파일 처리 인터페이스를 사용할  있다.

MutipartRequest
(HttPServletRequest request, String saveDirectory, int maxPostSize, String encoding)

파일을 저장할 디렉토리를 지정할  있으며업로드제한 용량을 설정할  있다.(바이트단위). 이때 업로드 제한 용량을 넘어서 업로드를 시도하면 IOException 발생된다또한 국제화 지원을 위한 인코딩 방식을 지정할  있다.

MutipartRequest
(HttPServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy policy)

파일을 저장할 디렉토리를 지정할  있으며업로드제한 용량을 설정할  있다.(바이트단위). 이때 업로드 제한 용량을 넘어서 업로드를 시도하면 IOException 발생된다또한 국제화 지원을 위한 인코딩 방식을 지정할  있으며중복 파일 처리 인터페이스를사용할  있다.

MutipartRequest
(HttPServletRequest request, String saveDirectory, String encoding)

파일을 저장할 디렉토리를 지정할  있으며국제화지원을 위한 인코딩 방식을 지정할  있다.

 

3) MultipartRequest 메소드

반환타입

설명

Enumeration 

getFileNames()

업로드  파일들에 대한 이름을 Enumeration객체에 String형태로 담아 반환한다이때의 파일 이름이란 클라이언트 사용자에 의해서 선택된 파일의 이름이 아니라개발자가 form file타임에 name속성으로 설정한 이름을 말한다만약 업로드  파일이 없는 경우엔 비어있는 Enumeration객체를 반환한다.

String 

getContentType(String name)

업로드  파일의 컨텐트 타입을 얻어올  있다 정보는 브라우저로부터 제공받는 정보이다이때 업로드  파일이 없는 경우에는 null 반환한다.

File

getFile(String name)

업로드  파일의 File객체를 얻는다우리는  객체로부터 파일사이즈 등의 정보를 얻어낼  있다이때 업로드  파일이 없는 경우에는 null 반환한다.

String

getFilesystemName(String name)

시스템의 파일 이름을 반환한다이때 업로드  파일이 없는 경우에는 null 반환한다.

String 

getOriginalFimeName(String name)

중복 파일 처리 인터페이스에 의해 변환되기 이전의 파일 이름을 반환한다이때업로드  파일이 없는 경우에는 null 반환한다.

String

getParameter(String name)

지정한 파라미터의 값을 반환한다이때 전송된 값이 없을 경우에는 null 반환한다.

Enumeration 

getParameternames()

폼을 통해 전송된 파라미터들의 이름을 Enumeration객체에 String 형태로 담아 반환한다전송된 파라미터가 없을 경우엔 비어있는 Enumeration객체를 반환한다

String[] 

getparameterValues(String name)

동일한 파라미터 이름으로 전송된 값들을 String배열로 반환한다이때 전송된파라미터가 없을 경우엔 null 반환하게 된다동일한 파라미터가  하나만 존재하는 경우에는 하나의 요소를 지닌 배열을 반환하게 된다.

4) 파일 업로드

1. 저장할 폴더

- 파일이 저장될 폴더를 미리 만들어 놓아야 파일이 만들어진 폴더에 저장된다. eclipse에서 WebContent에 폴더 생성

2. 파일 업로드 view

- 파일 업로드를 사용하기 위해서 form은 항상 post방식이어야 하며 enctype을 지정해 주어야 한다.

<form name="formUpload" method="post" enctype="multipart/form-data" action="upload_cos_ok.jsp">

<input type="file" name="upfile" onkeydown="event.returnValue=false;">

<!-- onkeydown 키보드가 입력되었을  발생하는 이벤트 -->

<textarea name="contents" rows="5" cols="55"></textarea>

</form>

3. 파일 업로드 ok view

- 파일 업로드 객체를 생성과 정보를 보려면 import 해야 한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ page import="java.io.File, java.io.IOException, com.oreilly.servlet.MultipartRequest, com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>

 

<html>

<body>

<%

    String encType="euc-kr";    //인코딩 타입

    int sizeLimit=1*1024*1024;    //1메가

    

/* WebContent 미리 만들어 놓은 upload폴더의 절대경로 구하는 방법1 */

    String saveFolder=" Fileupload/upload"//파일이 저장될 폴더명

    String savePath1=""//  어플리케이션의 절대 경로가 저장될 객체

    ServletContext context = getServletContext();
    
savePath1 = context.getRealPath(saveFolder);    //현재 jsp페이지의  어플리케이션상의 절대경로

 

/* WebContent 미리 만들어 놓은 upload폴더의 절대경로 구하는 방법2 */

    String savePath2=application.getRealPath("Fileupload/upload");

 

/* WebContent 미리 만들어 놓은 upload폴더의 절대경로 구하는 방법3 */

    String savePath3=request.getRealPath("Fileupload/upload");

 

    try{

/* 전송을 담당할 컴포넌트를 생성하고 파일을 전송(전송할 파일명을 가지고 있는 객체서버상의 절대경로최대 업로드될 파일 크기인코딩중복파일처리)*/

        MultipartRequest multi=new MultipartRequest(request, savePath1, sizeLimit, "euc-kr" ,new DefaultFileRenamePolicy());

        

        String originalFileName = multi.getOriginalFileName("upfile");    // 중복 처리 전의 파일 이름 ()안은 input업로드 파일의 이름

        

        //시스템의 파일 이름 반환(업로드 파일 없으면 null반환)

        String fileName = multi.getFilesystemName("upfile");    

        

        /* 파일이 업로드 되었는지 체크 */

        if(fileName==null){

%>

    <h2>파일이 업로드 되지 않았습니다.</h2><br>

    <a href = "javascript:history.back()">다시 업로드 하기</a>

<%

        }else{    //파일이 업로드 되었을 

            //파일 객체 얻기

            File file1 = multi.getFile("upfile");    

            String contents = multi.getParameter("contents");    // 파라미터 객체

%>

    <h2>파일 업로드가 정상적으로 완료되었습니다!!</h2>

    저장된 파일 이름 : <%=fileName%><br>

    변경되기 이전의 파일 이름 : <%=originalFileName%><br>

    설명 : <%=contents%><br>

    사이즈 : <%=file1.length()%>Byte<br>

    ContentType : <%=multi.getContentType("upfile")%><br>

<%

        }

    }catch(IOException e){

        out.print("<h2>IOException 발생했습니다 </h2> <br> <pre>" + e.getMessage() + "</pre>");

    }

%>

</body>

</html>

4. 파일 다운

- 파일을 다운 받을 때는 파일의 경로에 링크를 걸어주면 다운 받을 수 있다.

<a href="upload/<%=fileName%>"><%=fileName%></a>

 

* * 주의점 * *

폴더 계층 구조 : BoardTest>Fileupload>upload

- BoardTest 다이나믹웹프로젝트 , Fileupload web-content안의 폴더 (파일 업로드하는 jsp파일은 여기에 있음), upload 파일이 저장되는 폴더 

현재 경로 : http://localhost:8090/BoardTest/Fileupload/upload_cos_ok.jsp

링크를   현재 경로에서 upload폴더 안으로 들어갈  있도록 'upload/' 써주면 다운 받을  있다.