2013. 3. 15. 01:18

Commons-Fileupload

I. Commons-fileupload 란?

커먼스의 파일 업로드 패키지는 사용법이 쉬우며 쓸만한 함수들을 많이 지원합니다.

SmartUpload, MultipartRequest, Commons fileupload등을 모두 사용해 보았지만 개인적으로 가장 애착이 가는 파일 업로드입니다.

아쉬운점은 Commons-fileupload는 지난 2003년 6월 1.0버젼으로 정식 릴리즈 되었지만 그 이후로 이렇다 할 패치나 보안이 전혀 안되었다는 것입니다. 이말은 파일 업로드 자체가 그리 복잡한 패키지가 아니며 첫 정식 버젼이 그만큼 완벽하다는 것을 반증하는 말이기도 하겠지요 ^^

II. 다운로드 및 설치

자 다운로드 받으러 갑시다.

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

설치는 역시나 /WEB-INF/lib/ 폴더에 복사합니다.

III. 파일 업로드 처리 단계

먼저 파일 업로드된 아이쳄을 처리하기 전에 유효한 Request인지 확인해야 합니다.

boolean isMultipart = FileUpload.isMultipartContent(request);

이 코드는 현재 request가 multipart/form-data로 데이터를 전송했는지 유무를 true/false로 반환합니다.

업로드된 아이템이 매우 작다면 메모리에서 처리합니다.

큰 아이템이라면 임시 파일을 만들어 디스크에 저장하여 처리합니다.

너무 큰 아이템이라면 당연히 거부해야 합니다.

그렇지 않고 디폴트로 설정한 메모리, 최대값의 범위를 초과하지 않는다면 업로드를 시작합니다.

② ~ ⑤ 까지를 다음과 같이 간단히 할 수 있습니다.

// 파일 업로드 핸들러를 생성
DiskFileUpload upload = new DiskFileUpload();

// 한번에 메모리에 저장할 사이즈 설정

upload.setSizeThreshold(yourMaxMemorySize);

// 파일 업로드 최대 사이즈를 설정

upload.setSizeMax(yourMaxRequestSize);

// 파일 업로드 경로를 설정
upload.setRepositoryPath(yourTempDirectory);

이제 전송된 request를 parsing하여 아이템들을 추출합니다.

List /* FileItem */ items = upload.parseRequest(request);

위에서 설정한 값들을 request parsing단위로 따로 설정 할 수 있습니다.

List /* FileItem */ items = upload.parseRequest(request,
yourMaxMemorySize, yourMaxRequestSize, yourTempDirectory);

이렇게 추출된 items를 이제 폼필드 타입에 따라 적절히 처리 합니다.

Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

// 파일 타입이 아닌 다른 폼필드라면
if (item.isFormField()) {
processFormField(item);

// 파일 타입 폼필드라면
} else {
processUploadedFile(item);
}
}

폼필드에 따른 처리

만약 폼필드가 파일 이외의 파라미터라면 다음과 같이 처리하면 됩니다.

if (item.isFormField()) {
//파라미터 이름

String name = item.getFieldName();

//파라미터 값

String value = item.getString();
...
}

만약 폼필드가 파일 파라미터라면 다음과 같이 처리하면 됩니다.

if (!item.isFormField()) {

// 파라미터 이름
String fieldName = item.getFieldName();

// 파일 이름 (경로포함)
String fileName = item.getName();
String contentType = item.getContentType();

// 업로드한 파일이 메모리에 저장된 상태면 true, 거렇지 않고 임시 파일로 저장된 경우 false를 리턴
boolean isInMemory = item.isInMemory();

// 파일사이즈
long sizeInBytes = item.getSize();
...

// 파일 객체를 하나 만들어 업로드 완료!

File uploadedFile = new File(...);

item.write(uploadedFile);
}

파일 업로드 방식

파일 업로드 방식에는 모두 3가지가 존해합니다.

-. FileItem.write(File file);

-. FileItem.getInputStream();

-. FileItem.get()

write 는 직접적으로 업로드한 파일을 저장하는 가장 일반적이고 간단한 방식입니다.

나머지 두 방식은 스트림을 사용하여 업로드한 파일이 어떤 특별한 처리를 할 때 사용합니다. 혹은 데이터베이스에 바로 저장 할 경우에도 사용될 수 있습니다. 특히 get()은 메모리에 모두 할당하여 작업을 하니 주의를 요합니다.

VI. 샘플코드

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

public class UploadServlet extends HttpServlet {

String upload = null;


public void init(ServletConfig config) throws ServletException {
super.init(config);
upload = config.getServletContext().getRealPath("/upload/")
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {

if (FileUpload.isMultipartContent(request)) {

DiskFileUpload fileUload = new DiskFileUpload();
fileUpload.setRepositoryPath(upload);
fileUpload.setSizeMax(100*1024*1024);
fileUpload.setSizeThreshold(1024*50);

List items = fileUpload.parseRequest(request);

Iterator iterator = items.iterator();
while (iterator.hasNext()) {


FileItem item = (FileItem) iterator.next();

if (!item.isFormField()) {
if (fileItem.getSize() > 0) {
//파일 이름을 가져온다
String filename = fileItem.getName().substring(fileItem.getName().lastIndexOf("\\")+1);

try {
File file = new File(upload+filename);
fileItem.write(file);
} catch (IOException e) {
System.out.println(e);
}
}
}
}
}

} catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) {

// 파일 사이즈 초과시 발생하는 익셉션
System.out.println("파일 사이즈가 100메가 보다 더 초과되었습니다");
} catch (Exception e) {
System.out.println("업로드시 예기치 못한 오류가 발생하였습니다");
}
}
}

 

http://levin01.blog.me/100011050050

'ApplicationPrograming > Java' 카테고리의 다른 글

Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
Commons-DbUtils  (0) 2013.03.15
JDOM  (0) 2013.01.31
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
랜덤 숫자 생성  (0) 2012.06.11
Posted by 물색없는세상
2013. 3. 10. 02:13

1. 들어가는 말

대체로 개발자들은 GUI 환경 보다는 명령어를 직접 입력하여 그 결과를 바로 확인할 수 있는 console환경을 선호합니다.
물론 어디까지나 대체로 그렇다는 것이니 이 부분에 대한 논의는 피하도록 하겠습니다. 우선 저 부터도 소위 말하는 CUI를
선호하는 편입니다. 특히 리눅스나 유닉스 등의 서버에 원격으로 접속하여 작업을 할 때는 거의 그렇지요.

원격접속은 통상 전용 클라이언트 프로그램을 이용하기 때문에 해당 프로그램의 옵션에서 자신이 원하는 폰트를 결정할 수
있습니다. 그렇다면 윈도에선 어떨까요? 윈도의 명령 프롬프트(cmd)에서 말입니다.



2. 윈도의 명령 프롬프트에 폰트 추가하기 전 사전지식

기본적으로 한글 폰트는 굴림체가 내정되어 있습니다. 영문 환경에선 Lucida ConsoleConsolas가 준비되어 있구요.
개인적으로 저는 <Courier New>폰트를 선호하는 편입니다. 그리고 최근엔 <나눔고딕코딩>이라는 폰트를 알게 되었구요.

어쩌면 눈치 채셨을지도 모르겠습니다. 앞에 나열한 폰트들의 공통점이요, 모두 고정폭 폰트들입니다. 콘솔에선 기본적으로
고정폭 폰트 만을 사용할 수 있도록 되어 있기 때문에 폰트를 추가하실 때 이점을 꼭 기억해두셔야 합니다.



3. RegEdit을 이용한 레지스트리 수정으로 폰트 추가

명령 프롬프트에서 사용할 폰트를 추가하시려면 레지스트를 수정해야 합니다. 시작>실행에서 regedit 이라고 입력하신 후
엔터를 누르면 레지스트리 편집 프로그램이 기동됩니다. 아래 그림을 참고 하십시오.




수정해야 할 레지스트리의 경로는 다음과 같습니다.

HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont





해당 키에 새로운 문자열값을 입력해주면 됩니다. 다음 그림을 참고하세요. 참고로 한글 로케일 코드는 949입니다.







4. 명령 프롬프트의 속성(폰트) 변경하기

이렇게 레지스트리를 수정하였으면 명령프롬프트의 속성 창을 열어 사용하고 싶은 폰트를 지정해주시면 됩니다.
우선 명령 프롬프트에서 사용할 로케일을 먼저 선택해주시구요. 한국어로 선택을 했습니다. 참고로 레지스트리에
0, 00, 000으로 등록된 값은 437 (OEM-미국)에 해당하는 값입니다.






글꼴 탭을 보시면 전에 없던 나눔고딕코딩이라는 폰트가 보이지요? 이걸 선택하시고 폰트 크기도 적당하게 지정해주세요.
물론 당연한 것이지만 윈도에 나눔고딕코딩 폰트가 먼저 설치되어 있어야 겠지요?






결과를 확인해 보도록 하겠습니다. 우선 아래 첫번째 그림은 영문 로케일에서 Courier New폰트를 지정한 경우이구요,
두번째 그림은 한글 로케일에서 나눔고딕코딩을 지정한 경우입니다.








 






5. 짧은 글을 마치며

늘 옆에 끼고 살아야 하는 콘솔창(명령 프롬프트)을 내 입맛에 맞게 꾸밀 수 있다는 것, 즐거운 일이지요!
그리고 나눔고딕코딩 폰트가 필요하신 분은 프로젝트 홈페이지[각주:1]를 방문하셔서 다운로드 하실 수 있습니다.









  1. http://dev.naver.com/projects/nanumfont [본문으로]

http://likebnb.tistory.com/92

Posted by 물색없는세상
2013. 1. 31. 16:34

라이브러리 다운로드 : http://www.jdom.org/

★ XML 생성 순서

1. Document 생성

: Document document = new Document();

2. root Element 생성

: Element root = new Element("루트");

3. 기타 Element 생성

: Element e1 = new Element("첫번째엘리먼트");

4. Document에 root 추가

: document.setRootElement(root);

5. 상위 노드에 하위 노드 추가

: root.addContent(e1);

6. 상위 노드에 값 데이터 설정

: e1.setText("값");

결과 - 일단은 Document 타입

<?xml version="1.0" encoding="UTF-8"?>
<루트><첫번째엘리먼트>값</첫번째엘리먼트></루트>

★ XMLOutputter를 이용항 Document 객체 출력

1. XMLOutputter 객체 생성

XMLOutputter outputter = new XMLOutputter();

2. Format 객체 생성 - 가독성을 고려

Format format = outputter.getFormat();

2-1. 인코딩, 들여쓰기, 줄바꿈 설정

format.setEncoding("UTF-8");

format.setIndent("\t");

format.setLineSeparator(LineSeparator.DEFAULT);

2-2. textMode 설정

format.setTextMode(Format.TextMode.NORMALIZE);

※ PRESERVE : 원본 유지

TRIM : 좌우 여백 제거

NORMALIZE : 좌우 여백 제거 + 내부 여백을 한칸 여백으로

TRIM_FULL_WHITE :

3. XMLOutputter 에 Format 설정

outputter.setFormat(format);

4. 객체 출력

String으로 출력

: outputter.outputString(document);

표준 출력

: outputter.output(document, System.out);

파일로 출력

: outputter.output(document, new FileoutputStream("이름.확장자");

: outputter.output(document, new FileWriter("이름.확장자");

소켓으로 출력

: stream = new DataOutputStream(소켓.getOutputStream());

outputter.output(document, stream);

결과 - String 타입으로 변환. 가독성이 높아짐.

<?xml version="1.0" encoding="UTF-8"?>

<루트>

<첫번째엘리먼트>값</첫번째엘리먼트>

</루트>

 

http://blog.naver.com/comkwang17/140176506563

'ApplicationPrograming > Java' 카테고리의 다른 글

Commons-DbUtils  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
랜덤 숫자 생성  (0) 2012.06.11
jar파일 실행  (0) 2012.05.04
Posted by 물색없는세상