나 자신을 다스리는 자가 세상을 다스린다.

'Jakarta'에 해당되는 글 3건

  1. 2007.01.09 텍스트 검색엔진 Lucene
  2. 2007.01.09 Ant 주요 사용법
  3. 2006.12.18 commons fileupload 사용예제
2005년에 정리해 놓은 내용 (lucene-1.2 기준)

지금은 lucene.2.0.0 까지 release 된 상태여서 어떻게 변했는지..

귀차니즘으로 인하여 추후 사용할 일 있을 때 수정하겠습니다.


Analyzer 선택

 한글의 경우 가장 많이 사용하는 Analyzer :
org.apache.lucene.analysis.cjk.CJKAnalyzer()
=====================================================================

IndexWriter 생성
IndexWriter(String dir, Analyzer analyzer, boolean create);

create - 인덱싱 정보를 새로 생성할 것인지의 여부. 초기화할때만 true, 그외에는 false 로..

 예제)
 IndexWriter writer = new IndexWriter("C:\\indexDB\test", new org.apache.lucene.analysis.cjk.CJKAnalyzer(), false);
=====================================================================

Document 의 생성 및 저장

Document 는 하나의 행으로 생각
Field 는 한 행의 하나의 필드로 생각

Field 에는 Text, Keyword, UnIndexed, UnStored 의 4가지 타입.

                토큰처리  인덱싱처리    텍스트값저장
Text              O             O                    O
Keyword        X             O                    O
UnIndexed     X             X                    O
UnStored       O             O                    X

Text  - 가장 기본, 기사제목이나 요약정보
Keyword  - URL, 회원ID, 이름등의 고정값 갖고 크기가 작은 텍스트 정보
UnIndexed - 검색결과와 함께 보여줘야하는 정보
UnStored - 게시판의 텍스트, 기사의 본문내용 등 크기가 큰 텍스트 데이터

  ex)
  org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();
  doc.add(org.apache.lucene.document.Field.Keyword("name", name));
  doc.add(org.apache.lucene.document.Field.UnIndexed("part", "title"));
  doc.add(org.apache.lucene.document.Field.Text("contents", name));

  writer.addDocument(doc); //IndexWriter 에 Document add
=====================================================================

인덱싱 파일 존재 여부

org.apache.lucene.store.Directory fsDir = null;
fsDir = org.apache.lucene.store.FSDirectory.getDirectory(String path, boolean create);
boolean indexing = fsDir.fileExists("segments"); // segments 파일의 존재여부로 indexing 여부 확인
=====================================================================

검색하기

1. IndexSearcher 생성
 org.apache.lucene.search.IndexSearcher is = new org.apache.lucene.search.IndexSearcher(String path);
  => path 는 index 의 위치

2. Analyzer 객체 생성
Analyzer analyzer = new org.apache.lucene.analysis.cjk.CJKAnalyzer();

3. Query 객체 생성
 org.apache.lucene.search.Query qr = org.apache.lucene.queryParser.QueryParser.parse(String query, String field, Analyzer analyzer);

 첫번째 인자 query - 검색어 ex) 검색, 검색*, 검색?, 검색 or 결과 등등
 두번째 인자 field - 검색할 때 사용할 필드명

4. Query 객체를 IndexSearcher 에 전달하여 검색
 org.apache.lucene.search.Hits hits = is.search(Query query);

 ※ Hits 클래스가 제공하는 메소드
 length() - int  - 검색된 문서의 개수
 doc(int n) - Document - 결과 목록에서 위치가 n 인 문서
 id(int n) - int  - 결과 목록에서 위치가 n 인 문서의 ID를 구한다.
 score(int n) - float  - 결과 목록에서 위치가 n 인 문서의 스코어를 구한다.(문서와 검색어 사이의 관련도를 계산)

 ※ Sort 의 경우
 hits = is.search(Query query, new org.apache.lucene.search.Sort("Sort field명"));

 ※ 여러번의 Query 가 필요한 경우
 Query query1 = QueryParser.parse(String query, String field, Analyzer analyzer);  // query1 을 QueryFilter 에 담는다.

 org.apache.lucene.search.QueryFilter queryFilter1 = new org.apache.lucene.search.QueryFilter(query1);

 Query query2 = QueryParser.parse(String query, String field, Analyzer analyzer); 

 // filteredQuery 에 queryFilter1 와 query2를 담는다.
 org.apache.lucene.search.FilteredQuery filteredQuery = new org.apache.lucene.search.FilteredQuery(query2, queryFilter1);

 // filteredQuery 를 QueryFilter 에 담는다.
 QueryFilter queryFilter2 = new QueryFilter(filteredQuery);   

 Query query3 = QueryParser.parse(String query, String field, Analyzer analyzer);

 // 여러 개의 쿼리 적용을 위하여   BooleanQuery 사용
 BooleanQuery booleanQuery = new BooleanQuery();
 // query 를 BooleanQuery 에  ADD
 booleanQuery.add(query3, true, true);
 // queryFilter2 를 BooleanQuery 에  ADD
 booleanQuery.add(queryFilter2 , true, false);   

 Hits hits = searcher.search(booleanQuery, new org.apache.lucene.search.Sort("필드명"));
=====================================================================

인덱스 정보의 삭제 및 변경

1. org.apache.lucene.index.IndexReader 생성
 org.apache.lucene.index.IndexReader reader = org.apache.lucene.index.IndexReader.open(String path);

 IndexReader 는 인덱스 정보를 읽어올때 사용하는 클래스, 사용후 close 해줘야함.
 path 은 lucene 인덱스 정보 패스

2. 삭제하고자 하는 인덱스에 해당하는 Term 객체를 생성
 org.apache.lucene.index.Term term = new org.apache.lucene.index.Term(String filedName, String value)
 첫번째 인자 fileName - 문서의 필드명
 두번째 인자 value - 해당 필드의 값

3. 해당 문서 삭제
 reader.delete(term);
 
인덱스 정보를 변경해 주는 기능은 제공하지 않는다. 삭제후 정보를 추가하는 방식으로..
=====================================================================

쿼리 문자열

String query = "title:jakarta OR tomcat";
org.apache.lucene.search.Query qr = org.apache.lucene.queryParser.QueryParser.parse(query, String field, Analyzer analyzer);
=> query 에 컬럼명: 으로 구별하여 여러개의 컬럼에 대한 검색 가능

와일드카드(*) 는 Analyzer 에 따라 다른 결과가 나올수 있음.
=====================================================================

Analyzer 커스터마이징

- org.apache.lucene.Analyzer 객체와 org.apache.lucene.TokenStream 상속받아 객체 알맞게 구현
- org.apache.lucene.Token 객체 이용
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'작업공간 > 프로그래밍' 카테고리의 다른 글

FCKeditor(WEB HTML Editor) - JAVA 사용법  (0) 2007.01.09
텍스트 검색엔진 Lucene  (0) 2007.01.09
Ant 주요 사용법  (0) 2007.01.09
Log4J 사용하기  (0) 2006.12.27
Posted by trypsr Trackback 0 Comment 0
아래 내용은
고수로 가는 지름길! Jakarta Project
이클립스 기반 프로젝트 필수 유틸리티: CVS, Ant, JUnit
두 책의 ant 부분을 보고 정리하였습니다.

# build.xml 파일의 기본구조
<?xml version="1.0" encoding="euc-kr"?>
<project name="projectName" default="defaultTargetName" basedir=".">
 <property name="" location=""/>
 <target name="">...</target>
 <target name="" depends="">...</target>
 <target name="" depends="">...</target>  
 <target name="" depends="" if="">...</target>
 <target name="" depends="" unless="">...</target>  
</project>

# project 태그
 1) name : 프로젝트의 이름
 2) default : Ant를 실행할때 target을 지정하지 않은 경우 기본적으로 사용할 target (필수)
 3) basedir : 경로 계산할때의 기준 디렉토리. 지정하지 않은 경우 현재 디렉토리가 basedir로 사용된다. basedir 프로퍼티의 값으로도 사용된다.

# target 태그
 1) name : 타켓의 이름 (필수)
 2) depends : 이 타겟이 의존하고 있는 타겟의 목록. 각 타켓의 이름은 ,(콤마) 로 구분한다.
 3) if : 지정한 프로퍼티가 설정되어 있는 경우 이 타겟을 수행한다.
 4) unless : 지정한 프로퍼티가 설정되어 있지 않은 경우 이 타겟을 수행한다.
 5) description : 타겟이 수행하는 기능에 대한 설명
 
# ant 경로 규칙
 1) * : 0개 또는 그이상의 글자가 매칭
 2) ? : 한글자와 매칭
 3) ** : 다계층을 나타냄  예) dir/**/A => dir/dir1/A, dir/dir2/A, dir/dir1/dirA/A 다 포함.
 4) / 또는 \ 으로 끝날 경우  : /** 또는 \** 과 동일
 
# includes 속성 : 포함시킬 파일의 목록 (include 태그, includesfile 속성으로 사용 가능)

# excludes 속성 : 제외시킬 파일의 목록 (exclude 태그, excludesfile 속성으로 사용 가능)

# excludes 속성 명시 여부에 상관없이 제외 되는 것들 : 제외 시키고 싶지 않을 경우 defaulteexcludes = "no" 설정
 - **/*~, **/#*#, **/.#*, **/%*%, **/._*
 - **/CVS, **/CVS/**, **/.cvsignore
 - **/SCCS, **/SCCS/**
 - **/vssver.scc
 - **/.svn, **/.svn/**
 - **/.DS_Store

# fileset 태그 : 파일 집합
 1) dir : 파일 집합을 표시할 때의 루트 디렉토리 (dir 또는 file 중 한개 반드시 명시)
 2) file : 한 개의 파일을 명시할 때 사용하는 속성  (dir 또는 file 중 한개 반드시 명시)
 3) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 4) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <fileset dir="${basedir}/src" defaultexcludes="no">
  <include name="**/*.java"/>
  <include name="**/*.properties"/>
  <exclude name="**/*.bak"/>
 </fileset>

# dir 태그 : 디렉토리 집합
 1) dir : 디렉토리 집합을 표시할 때의 루트 디렉토리 (필수)
 2) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 3) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <dirset dir="" includes="" excludes=""/>
 
# patternset 태그 : 재사용 가능한 파일 집합
 사용 예)
 <patternset id="commonJar">
  <include name="servlet.jar"/>
  <include name="mail.jar"/>
  <include name="activation.jar"/>    
 </patternset>
 
 <fileset dir="j2eelib">
  <patternset refid="commonJar"/>
 </fileset>
 
# path 태그 : 재사용 가능한 경로 목록의 집합
 사용 예)
 <path id="project.class.path">
  <pathelement location="fileupload/WEB-INF/classes"/>
  <pathelement path="lib/servlet.jar;lib/commons-fileupload-1.0.jar"/>
 </path>
 
 <classpath refid="project.class.path"/>
 
 - location : 하나의 파일 또는 디렉토리 지정
 - path : 여러 경로를 지정 (; 또는 : 으로 구분)


# 아래의 build.xml 파일에서 ant makeZip 을 할경우 complie 은 두번이 아닌 한번만 실행되게 된다.
 <project name="build" default="makeZip" basedir=".">
  <target name="compile"/>
   <target name="srcCopy" depends="compile"/>
   <target name="classCopy" depends="compile"/>
   <target name="makeZip" depends="srcCopy, classCopy"/>
 </project>

# property 태그 : property 지정
 1) name : 프로퍼티의 이름
 2) value : 프로퍼티의 값을 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 3) location : 지정한 경로명의 절대 경로명을 값으로 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 4) resource : 프로퍼티 파일을 읽어 올 때 사용할 자원명을 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 5) file : 지정한 파일로부터 프로퍼티 목록을 읽어 온다 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 6) environment : 환경 변수를 읽어 올때 사용할 접두어를 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 7) classpath : 자원으로부터 프로퍼티 파일을 읽어 올 때 사용할 클래스 패스
 8) classpathref : 클래스패스로 사용할 경로를 path 태그 로 부터 가져온다.
 9) prefix : resource 또는 file 속성을 사용하여 읽어 온 프로퍼티를 참조할 때 사용할 접두어를 지정한다. 만약 접두어 맨뒤에 "." 가 포함되어 있지 않을 경우, 자동으로 "."이 접두어 뒤에 붙는다.
 사용 예)
 <property file="${basedir}/buildprop/global.properties"/>
 
 <property environment="env"/>
 <echo message="JAVA_HOME ${env.JAVA_HOME}"/>

# 기본 프로퍼티 : property 태그 사용하지 않아도 사용 가능한 프로퍼티
 - 모든 자바의 시스템 프로퍼티
 - basedir : 프로젝트의 기본 디렉토리의 절대 경로. project 태그의 basedir 속성에 명시된 값
 - ant.file : 빌드 파일의 절대 경로
 - ant.version : Ant 버전
 - ant.project.name : 현재 실행주인 프로젝트의 이름. project 태그의 name 속성에 명시된 값
 - ant.java.version : Ant 가 발견한 자바 버전.
 
# javac
 1) srcdir : 소스가 위치한 디렉토리 (src 태그로 지정가능. 둘 중 하나 필수)
 2) descdir : 생성된 클래스가 위치할 디렉토리를 지정. javac -d 옵션과 동일
 3) classpath : 컴파일할 때 사용할 클래스패스 (class 태그로 지정 가능)
 4) classapathref : path 태그로 지정한 경로를 클래스패스로 참조
 5) encoding : 소스파일의 인코딩을 지정. javac -encoding 옵션과 동일
 6) nowarn : 컴파일시 -nowarn 옵션 추가 (on) 기본값은 off
 7) deprection : 컴파일시 -deprecation 옵션 추가 (on) 기본값은 off
 사용 예)
 <javac srcdir="" descdir="">
  <classpath>
   <fileset>
    <patternset refid=""/>
   </fileset>
  </classpath>
 </javac>
 
# jar
 1) destfile : 생성할 jar 파일 지정
 2) basedir : jar 파일로 압축할 기본 디렉토리 지정

 사용 예)
  <jar destfile="${disc}/lib/app.jar" basedir="${build}/classes"/>
 
  <jar destfile="${disc}/lib/app.jar">
   <fileset dir="${build}/classes" exclude="**/test*.class"/>
   <fileset dir="${src}/resources"/>
  </jar>

# zip
 - 기본적으로 jar 사용법와 같이 사용 가능.
 - zipfileset 태그를 사용하여 압축되는 파일의 경로명을 변경할 수 있음.
 - zipfileset 의 속성
  1) prefix : ZIP 파일에 압축될 때 변경되어 들어갈 경로명
  2) fullpath : 특정 파일의 변경될 경로를 지정
  3) filemode : 유닉스 기반의 시스템에서 압축되는 파일의 모드를 지정. 기본값은 644
  4) dirmode : 유닉스 기반의 시스템에서 압축되는 디렉토리의 모드를 지정. 기본값은 775
 사용 예)
 <zip destfile="${dist}/example.zip">
  <zipfileset dir="build/api" prefix="docs/api"/>
  <zipfileset dir="${basedir}" includes="chang.log.20031227" fullpath="docs/chagelog.txt"/>
  <zipfileset dir="build/classes" prefix="classes"/>
  <zipfileset dir="build/src" prefix="src"/>
 </zip>

# war
  사용 예)
  <war destfile="main.war" webxml="src/metadata/web.xml">
   <fileset dir="src/mainapp/html"/>
   <fileset dir="src/mainapp/jsp"/>
   <lib dir="lib">
    <exclude name="logging2.jar"/>
   </lib>
   <classes dir="build/main/classes"/>
   <zipfileset dir="src/imagefile/images" prefix="images"/>
  </war>

# tar
 - 기본 사용 법 : <tar destfile="" basedir=""/>
 - tarfileset 태그
 - targileset 의 속성
  1) mode : 3자리 8진수값. 775 등의 값을 갖는다.
  2) username : 파일에 대한 사용자 이름을 지정한다. UID와는 다르다.
  3) group : 파일에 대한 그룹 이름을 지정한다. GID와는 다르다.
  4) prifix : tar 파일에 압축될 때 변경되어 들어갈 경로명
  5) fullpath : 특정 파일의 변경될 경로를 지정
  6) preserveLeadingSlashes : 맨 앞의 '/'를 유지할지의 여부를 지정. 기본값 : false
 사용 예)
 <tar destfile="${dist}/example.tar">
  <tarfileset dir="build/api" prefix="docs/api"/>
  <tarfileset dir="${basedir}" includes="chage.log.20031227" fullpath="docs/chagelog.txt"/>
  <tarfileset dir="build/classes" prefix="classes"/>
  <tarfileset dir="build/src" prefix="src"/>
 </tar>
 <gzip zipfile="${dist}/example.tar.gz" src="${dist}/example.tar"/>
 
 <tar destfile="${dist}/example.tar.gz" basedir="${build}" compression="gzip"/>

# javadoc
 1) sourcepath : 소스 파일의 경로 지정. 하위 디렉토리까지 모두 처리 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 2) sourcepathref : path 에서 지정한 경로를 소스 파일의 경로로 사용 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 3) sourcefiles : 소스 파일의 목록을 지정. 각 파일은 콤마(,)로 구분 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 4) destdir : 결과 파일이 생성될 디렉토리
 5) packagenames : 콤마로 구분된 패키지 파일의 목록. 패키지명이 *로 끝날 경우 그 하위 패키지까지 모두 처리한다.
 6) excludepackagenames : 문서를 생성하지 않을 패키지의 목록을 지정. 각 패키지는 콤마(,)로 구분. 패키지명이 *으로 끝날 경우 그 하위 패키지까지 모두 제외
 7) access : 접근 모드를 지정. public, protected, package, private 중 한 가지 값. 기본값 : protected
 8) public : 생성되는 API 문서에 public 클래스와 멤버만 보여준다.
 9) protected : 생성되는 API 문서에 protected/public 클래스와 멤버만 보여준다.
 10) package : 생성되는 API 문서에 package/protected/public 클래스와 멤버만 보여준다.
 11) private : 생성되는 API 문서에 private/package/protected/public 클래스와 멤버만 보여준다.
 12) encoding : 소스 파일의 인코딩을 명시.
 13) locale : ko_KR과 같이 사용할 로케일을 지정.
 14) charset : 생성된 문서를 보여줄 때 사용할 케릭터셋을 지정.
 15) version : @version 주석을 포함.
 16) author : @author 주석을 포함.
 17) nodeprecated : deprecated 정보를 포함하지 않는다.
 18) nodeprecatedlist : deprecated 목록을 생성하지 않는다.
 19) windowtitle : 문서를 위한 제목을 텍스트로 입력.
 20) overview : HTML 문서로부터 개략 문서를 읽어 온다.
 21) helpfile : 도움말로 사용할 HTML 파일을 지정.
 22) stylesheetfile : 스타일 시트로 사용할 파일을 지정.
 23) header : 생성될 HTML 파일의 헤더로 사용될 HTML 코드를 명시
 24) footer : 생성될 HTML 파일의 풋터로 사용될 HTML 코드를 명시
 
 사용 예)
 <javadoc destdir="{build}/api"
  sourcepath="src"
  packagenames="javacan.main.*"
  excludepackagenames="javacna.main.test.*"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr" />
 
 <javadoc destdir="{build}/api"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr">
  <packageset dir="src" defaultexcludes="yes">
   <include name="javacan/main/**"/>
   <exclude name="javacan/main/test/**"/>   
  </packageset>
 </javadoc>
 
# copy
 1) file : 복사할 파일을 지정 (fileset으로 복사할 파일 목록을 지정하지 않는 경우 필수)
 2) tofile : 복사될 파일을 지정
 3) todir : 원본을 복사할 디렉토리를 지정
 4) overwrite : 기존 파일 덮어쓰기 여부 (true/false) 기본값 : false
 5) preservelastmodified : 원본의 최종 수정 날짜 유지 여부(true/false) 기본값 : false
 6) includeEmptyDirs : 텅빈 디렉토리도 복사할지의 여부(true/false) 기본값 : true
 사용 예)
 <copy file="${workspace}/readme.txt.200312" tofile="${build}/readme.txt"/>
 <copy file="${workspace}/readme.txt.200312" todir="${build}"/>
 <copy todir="${build}/src">
  <fileset dir="${workspace}/src"/>
 </copy>
 
# mkdir
 사용 예)
 <mkdir dir="${build}/webapp/WEB-INF/classes"/>
 webapp/WEB-INF 또한 존재 하지 않는 경우 생성

# delete
 사용 예)
 <delete>
  <fileset dir="${build}"/>
 </delete>
 
 위의 경우 ${build} 와 그 하위 디렉토리의 모든 파일을 삭제. 그러나 디렉토리는 남아있음.(fileset 은 파일의 집합)
 아래와 같이 해주면 디렉토리도 전부 삭제
 
 <delete includeEmptyDirs="true">
  <fileset dir="${build}"/>
 </delete>
 
# ant : 또 다른 빌드 파일의 실행. 여러개의 서브 프로젝트로 구성되어 있을 경우 유용
 1) antfile : 사용할 빌드 파일을 지정. 명시하지 않을 경우 build.xml. dir 속성에 주어진 디렉토리에 대해 상대경로
 2) idr : 새로운 Ant 프로젝트의 basedir을 지정.
 3) target : 수행할 타켓을 지정
 4) output : 새로운 Ant 프로젝트의 수행 결과를 저장할 파일을 명시
 5) inheritAll : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 프로퍼티 전달 여부(true/false). 기본값 : true
 6) inheritRefs : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 참조 전달 여부(true/false). 기본값 : true
 사용예)
 <target name="makeSubProject">
  <ant dir="subproject/logging" target="prepare">
   <property name="module1.4" value="jdk1.4"/>
  </ant>
  <ant dir="subproject/common" target="prepare"/>
 </target>

# java
 1) classname : 실행할 클래스 이름 (classname, jar 둘중 하나 필수)
 2) jar : 실행할 jar 파일의 위치 (classname, jar 둘중 하나 필수)
 3) classpath : 사용할 클래스패스를 지정
 4) classpathref : 미리 지정한 path 태그를 참조
 5) fork : 세러은 가상머신에서 클래스 수행 여부 (true/false). 기본값 : false
 6) maxmemory : 포크된 가상 머신에 할당할 메모리의 최대 크기를 지정 (fork가 false인 경우 무시)
 7) dir : 가상 머신을 호출할 디렉토리 (fork가 false인 경우 무시)
 사용 예)
 <java classname="javacan.main.prepare.TableInitilizer">
  <classpath>
   <pathelement path="${java.class.path}"/>
  </classpath>
  <sysproperty key="module" value="test"/>
  <arg value="-init -d"/>
 </java>
 
# native2ascii : 유니코드로의 변환
 1) src : 변환할 파일들이 위치한 기준 디렉토리
 2) dest : 변환한 결과를 저장할 디렉토리
 3) encoding : 변환할 파일의 인코딩 (기본으로 JVM의 기본 인코딩 사용)
 4) reverse : 이스케이프된 유니코드를 지정한 인코딩을 사용하는 문자열로 변환.
 사용 예)
 <native2ascii src="${config}"
  dest="${build}/config"
  includes="**/*.properties"
  excludes="**/test/*.properties"
  encoding="EUC-KR"/>

사용 예제 )


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'작업공간 > 프로그래밍' 카테고리의 다른 글

텍스트 검색엔진 Lucene  (0) 2007.01.09
Ant 주요 사용법  (0) 2007.01.09
Log4J 사용하기  (0) 2006.12.27
XML을 String으로 변환  (0) 2006.12.27
Posted by trypsr Trackback 1 Comment 0

jakarta commons fileupload 사용 예제..

그러나 지금 진행중인 project 에서는 cos 를 사용하였다.

이유가 있었는데 기억이 안난다.

rename policy?  아닌데...

commons 에서 뭔가 불편한 것이 있었는데... (이놈의 단기 기억력)

기억해내면 꼭 적어놓아야지...

아무튼 jakarta commons fileupload 간단 사용 예제..

필요한 jar : jakarta commons fileupload 뿐만 아니라 jakarta commons io 도 필요하다.


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.lang.StringUtils;
import java.io.File;
...

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*10); // memory 에 저장할 최대 싸이즈 : 10K
factory.setRepository(tmpDir); // 저장할 디렉토리

ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*10); // upload 파일의 최대 크기 : 10M

HashMap param = new HashMap();

try {
   List items = upload.parseRequest(req);
   Iterator iter = items.iterator(); // Process the uploaded items

   while (iter.hasNext()) {
       FileItem item = (FileItem) iter.next();
       if (item.isFormField()) {
           param.put(item.getFieldName(), item.getString());
       } else {
           String fileName = uploadDir + StringUtils.substringAfterLast(item.getName(), File.seperator);
          item.write(new File(fileName));
       }
   }
} catch (Exception e) {
   log.error("에러 발생 : ", e);
}

...



http://blog.naver.com/minki0504/70008010059   ---> 여기 보시면 자세히 설명해 놓으셨네요.. 
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'작업공간 > 프로그래밍' 카테고리의 다른 글

Tomcat Encoding filger 적용하기  (0) 2006.12.18
commons fileupload 사용예제  (0) 2006.12.18
iBATIS 의 SqlMaps 에서 result class 오류  (0) 2006.12.18
달력 스크립트  (0) 2006.12.15
Posted by trypsr Trackback 0 Comment 0


티스토리 툴바