ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JSP] 파일 업로드
    기초/JSP 2017. 3. 15. 13:40

    서버 안에 특정 폴더, Upload된 파일을 담을 폴더를 만든다.

    /upload

    이름이 2가지가 있다

    오리지널 이름 : 사용자가 올린 파일 이름

    시스템 이름 : 업로드 파일의 이름이 중복되어 바뀐 이름


    중복되지 않았다면 오리지널 이름과 시스템 이름이 같겠지만

    중복되면 달라진다 

    ex) 새폴더 , 새폴더(2)


    일단 파일을 사용하기 위해서 MultipartRequest.class가 들어있는 jar파일을 다운한다


    *cos 라이브러리

    #1. 다운로드 받기 : cos.jar

    1)www.servlets.com

    2)com.oreilly.servlet

    3)cos-26Dec2008.zip

    4)압축풀기

    5)cos-26Dec2008\lib\에 cos.jar

    6)이클립스 webContent\web-inf\lib에 붙여넣기


    MultipartRequest.class를 사용하기 위해(5개의 인수가 존재)




    <input type="file" > 파일 다이얼로그가 나온다.

    그냥 type속성만 쓰면 파일의 내용이 아니라 제목만 올라간다 따라서 속성에 enctpye="" 을 부여해서 어떤 타입이 올라가는지 알려줘야 한다.


    [enctype]

    form 속성에 enctype = "multipart/form-data" 속성을 부여하자





    <%@page import="java.io.File"%>

    <%@page import="java.util.Enumeration"%>

    <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>

    <%@page import="com.oreilly.servlet.MultipartRequest"%>

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8"%>

    <%

    //업로드 시켜야 하는데 실제 경로는 어떻게 되나?

    //.metadata안에 ......wtpwebapps안에 프로젝트 ...에있는데

    // 프로젝트까지 getServletContext()로 가져올수 있다

    // 하위폴더 upload에 저장하기 위해서 + \\upload를 해준다

    // \ + u는 유니코드이므로 ... 주석에서도 에러처리가 난다!

    String realFolder = "";

    //현재 업로드 폴더의 이름

    String saveFolder = "upload";

    int maxSize = 5*1024*1024; // b > kb > mb > gb

    String encType="utf-8";

    //경로만들기!

    ServletContext context = request.getServletContext();

    System.out.println("context의 경로 : "+context.getContextPath());

    System.out.println("context의 경로 : "+context.getRealPath(saveFolder));

    MultipartRequest multi = null; //#1번

    try{

    multi = new MultipartRequest(

    request, //요청받은내용 request또한 넣어놨다.

    realFolder, //업로드 할 실제경로

    maxSize, //한번에 업로드 할 때마다 최대 파일 크기

    encType, //제목/내용등 인코딩 타입

    new DefaultFileRenamePolicy() //중복이름 삭제

    );

    Enumeration en = multi.getParameterNames();

    while(en.hasMoreElements()){

    String name = (String)en.nextElement();

    String value = multi.getParameter(name);

    %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>업로드 하기</title>

    </head>

    <body>

    <%=name %> : <%=value %><br>

    <hr>

    <%

    Enumeration enFiles = multi.getFileNames();

    while(enFiles.hasMoreElements()){

    String fname = (String)enFiles.nextElement(); // map형식으로 랜덤하게

    String sysFile = multi.getFilesystemName(fname); //업로드 이름

    String orgFile = multi.getOriginalFileName(fname); //업로드 된 이름

    String contextType = multi.getContentType(fname); //파일의 타입

    File file = multi.getFile(fname);

    long bytes = file.length();

    out.println("===========================<br>");

    out.println("파일명 : "+fname);

    out.println("원본이름 : "+orgFile);

    out.println("중복처리된 이름 : "+sysFile);

    out.println("팡리 형식 : "+contextType);

    out.println("용량 : "+bytes);

    out.println("===========================<br>");

    }

    }

    }catch(Exception e){e.printStackTrace();}

    %>

    </body>

    </html>

    가져오는 전체 소스이다



    [경로 알아오기]


    #프로젝트 - webcontent안에 upload라는 폴더를 따로 만들었다

    upload라는 폴더에 넣고 싶어서 서버에 저장되는 경로를

    contextpath로 가져오고

    realpath를 사용하기로 했다




    여기서 주목해야 할 점은 2가지다

    #1 MultipartRequest 



    MultipartRequest multi = null;



    *MultipartRequest 생성자*

    new MultipartRequest(1, 2, 3, 4, 5);

    1: request

    2: String path

    3: size(byte수)

    4: encoding(utf-8 | euc-kr)

    5: 중복이름 정책(인스턴스)


    multi를 선언하는데 이때 cos.jar에 들어있는 MultipartRequest를 사용하기 위함이다.


    1) MultipartRequest를 생성자를 통해 multi를 부여한다

    !! request또한 인자로 보내기 떄문에

    원래 사용하던 request대신 mutil로 가져오면 되는것이다


    #2 file은 getFileNames();

    로 읽어와야한다 


    따라서 enumeration 인터페이스를 2개를 만들어

    하나는 parameter를

    하나는 file을 가져와 처리했다 






    이때 파일에 대한 메소드가 있다

    1) multipartRequest.getParameter(); // 잘 가져다 쓰면됨(랩핑했다고함)

    2) getParameterValues()

    3) getParameterNames()

    4) getFileNames() : 파일이 여러개 일떄 !

    5) getFileSystemNames(): 중복처리된 이름

    6) getOriginFileNames(): 사용자가 올린이름

    7) getContentType() : MIME 타입을 알아오자

    8) getFile() : 업로드된 파일의 파일 객체를 반환하자!


    systemNames는 중복이 처리된 이름이다

    업로드시 파일이름이 겹치는 경우

    ex) 새폴더 새폴더 -> 새폴더 새폴더(1)

    새폴더(1)로 교체된 이름이며

    새폴더 새폴더는 실제 이름이기에 OriginFileNames에 저장된다.


    '기초 > JSP' 카테고리의 다른 글

    [JSP]데이터 베이스  (0) 2017.03.20
    [JSP] DB 환경설정(sql developer, eclipse)  (2) 2017.03.17
    [JSP] tag lib(fmt)  (0) 2017.03.14
    [JSP] tag lib 문법 (core)  (0) 2017.03.14
    [JSP] tag lib 다운및 //사용법(core)  (0) 2017.03.10

    댓글

Designed by Tistory.