'2013/03/15'에 해당되는 글 3건
- 2013.03.15 Commons-Fileupload의 한글관련 문제 추가
- 2013.03.15 Commons-DbUtils
- 2013.03.15 Commons-Fileupload의 한글관련 문제 추가
안녕하세요.. ^^
파일 업로드 찾다가 요기까지 왔네요.. ^^
샘플코드는 잘 봤습니다..
(샘플코드에 변수이름이 조금 잘못 되어 있는 부분이 있었습니다. - 큰문제는 아니죠.. ^^)
파일 업로드를 구현하면서 어려움(?)을 겪었던 부분과 해결 부분을 적어보려 합니다.
(저도 도움을 받았으니, 혹시나 저와 같은 어려움(?) 을 겪으신 분들을 위하여.. ^^)
* OS : Linux
* DB : Oracle
* WAS : OC4J 10g AS
/**
* form tag의 input name들이 아래와 같이 있습니다.
*/
String sMode = "";
String sPageNo = "";
String sKeyWord = "";
String sSearchPart = "";
String sSeqNum = "";
String sAnsTitle = "";
String sAnsContent = "";
String sFileName = "";
String sTmpFileName = "";
try {
//Multipart로 넘어왔는가?
if (FileUpload.isMultipartContent(req)) {
DiskFileUpload dfuUpload = new DiskFileUpload();
/**
* 이 부분 상당히 애를 먹었습니다.
* Windows 환경에서는 문제가 없는데,
* 개발 서버(Linux)로 올리게 되면 계속해서 한글이 깨지더군요.
*
* 그래서, 아래와 같이 DiskFileUpload의 HearderEncoding을 해주었습니다.
*/
dfuUpload.setHeaderEncoding("EUC_KR");
List lsItems = dfuUpload.parseRequest(req);
Iterator iterator = lsItems.iterator();
while (iterator.hasNext()) {
FileItem fItem = (FileItem) iterator.next();
/**
* 넘어오는 form이 multipart일때도 있고 아닐 경우도 있어서
* 처리한 부분입니다.
*
* HashMap을 사용해서 put한 다음에, 필요할때 꺼내 써도 무방할듯 합니다.
*/
if ("mode".equals(fItem.getFieldName())) {
sMode = fItem.getString();
} else if ("pageNo".equals(fItem.getFieldName())) {
sPageNo = fItem.getString();
} else if ("keyWord".equals(fItem.getFieldName())) {
//한글처리
sKeyWord = fItem.getString("EUC_KR");
} else if ("searchPart".equals(fItem.getFieldName())) {
sSearchPart = fItem.getString();
} else if ("seqNum".equals(fItem.getFieldName())) {
sSeqNum = fItem.getString();
} else if ("ansTitle".equals(fItem.getFieldName())) {
//한글처리
sAnsTitle = fItem.getString("EUC_KR");
} else if ("ansContent".equals(fItem.getFieldName())) {
//한글처리
sAnsContent = fItem.getString("EUC_KR");
}
//파일 타입 폼필드라면
if (!fItem.isFormField()) {
if (fItem.getSize() > 0) {
//파일 이름을 가져온다
//- 위에서 dfuUpload.setHeaderEncoding("EUC_KR")를 안해 줬더니
// 파일이름이 자꾸 깨지더군요.
sFileName = fItem.getName().substring(fItem.getName().lastIndexOf("\\") + 1);
try {
/**
* upload변수는 servlet에서 init 할때 아래와 같이 선언해 주었습니다.
* upload = config.getServletContext().getRealPath("/upload/suggest/");
*/
File file = new File(upload + sFileName);
fItem.write(file);
} catch (IOException e) {
System.out.println(e);
}
}
}
}
} else {
//multipart가 아닐때 사용되는 parameter들을 가지고 옴
//WebUtil은 null Check를 위한 util입니다. - 빼도 상관없습니다.
sMode = WebUtil.nvl((String) req.getParameter("mode"), "");
sPageNo = WebUtil.nvl((String) req.getParameter("pageNo"), "");
sKeyWord = WebUtil.nvl((String) req.getParameter("keyWord"), "");
sSearchPart = WebUtil.nvl((String) req.getParameter("searchPart"), "");
sSeqNum = WebUtil.nvl((String) req.getParameter("seqNum"), "");
sAnsTitle = WebUtil.nvl((String) req.getParameter("ansTitle"), "");
sAnsContent = WebUtil.nvl((String) req.getParameter("ansContent"), "");
}
} catch (Exception e) {
LogManager.getLogger("error").error(e.toString());
}
'ApplicationPrograming > Java' 카테고리의 다른 글
[HttpURLConnection] POST로 파라미터 넘기기 (0) | 2015.04.24 |
---|---|
자바 암호화 (0) | 2015.02.25 |
Commons-DbUtils (0) | 2013.03.15 |
Commons-Fileupload의 한글관련 문제 추가 (0) | 2013.03.15 |
JDOM (0) | 2013.01.31 |
Commons-DbUtils
I. 어디서 다운을 받나요?
http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi
II. 설치는 어떻게 하나요?
다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다
III. DbUtils란 무엇인가요?
DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.
IV. 왜 DbUtils를 사용해야 하는가요?
① resource 누출에 대한 어떠한 가능성도 없습니다
JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다
② 코드의 가독성이 높아집니다
데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.
③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다
V. 어떻게 사용하나요?
① Connection, Statement, ResultSet 의 close를 간단하게!
이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!
이 클래스는 모두 static 메소드들로 구성되어있습니다
사용예)
DbUtils.close(conn);
DbUtils.close(stmt);
DbUtils.close(rs);
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(conn, stmt, rs);
DbUtils.commitAndClose(conn);
DbUtils.commitAndCloseQuietly(conn);
DbUtils.loadDriver("com.mysql.jdbc.Driver");
DbUtils.rollback(conn);
closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,
즉 자신을 call한곳으로 throw 하지 않습니다
commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다
loadDriver 는 JDBC 드라이버를 로딩 합니다
② 파일로 저장된 SQL을 사용하자!
이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다
이 클래스는 SingleTone 패턴의 클래스입니다
즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다
사용예)
QueryLoader queryloader = QueryLoader.getInstance(); //싱글톤
HashMap hashmap = queryloader.load("sql");
queryloader.upload("sql");
queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다
load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어
HashMap으로 저장하여 리턴하여 줍니다
unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다
③ Setter함수로 더이상 머리 아프지 말자!
이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다
사용예)
...
BoardVO boardVO = null;
ArrayList arraylist = new ArrayList();
resultset = statement.executeQuery("SELECT * FROM board_t");
while (resultset.next()) {
boardVO = new BoardVO();
boardVO.setTitle("title");
boardVO.setContent("content");
boardVO.setWriter("writer");
arraylist.add(boardVO);
}
..
와 같은 코드는 다음과 같이 간략화 됩니다
ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();
List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);
정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..
select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~
QueryRunner는 다음과 같은 함수를 지원합니다
사용예)
QueryRunner queryrunner = new QueryRunner();
QueryRunner queryrunner = new QueryRunner(DataSource ds); //datasource를 바로 이용할 수 있다
queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)
여기서 말하는 Object param은 파라미터 전달시 사용됩니다
ArrayList params = new ArrayList();
params.add("100");
params.add("200");
ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();
List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);
select 뿐만 아니라 update, delete역시 가능합니다
사용예)
QueryRunner queryRunner = new QueryRunner();
queryRunner.update(Connection conn, String sql)
queryRunner.update(Connection conn, String sql, Object param)
queryRunner.update(Connection conn, String sql, Object params[])
ArrayList params = new ArrayList();
params.add(boardId);
queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());
와 같이 사용할 수 있습니다
VI. 샘플코드
public class DbUtilsExample() { public static void main(String[] args) { HashMap map = QueryLoader.getInstance().load("sql"); // (주의) load함수는 실행할때마다 파일을 읽습니다 Connection conn = null; try { DbUtils.loadDriver("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", ""); ArrayList params = new ArrayList(); ResultSetHandler rsh = new BeanListHandler(BoardVO.class); QueryRunner qr = new QueryRunner(); List list = qr.query(conn, (String)map.get("select"), params.toArray(), rsh); for (int i = 0; i < list.size(); i++) { BoardVO board = (BoardV)list.get(i); System.out.println(board.getTitle()); System.out.println(board.getContent()); System.out.println(board.getWriter()); ) } catch (Exception e) { System.out.println(e); } finally { DbUtils.closeQuitely(conn); } } } |
'ApplicationPrograming > Java' 카테고리의 다른 글
자바 암호화 (0) | 2015.02.25 |
---|---|
Commons-Fileupload의 한글관련 문제 추가 (0) | 2013.03.15 |
Commons-Fileupload의 한글관련 문제 추가 (0) | 2013.03.15 |
JDOM (0) | 2013.01.31 |
me2DAY XML Parsing (DOM) - 자바 XML파싱 (0) | 2012.07.24 |
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.*; public class UploadServlet extends HttpServlet { String upload = null;
try { DiskFileUpload fileUload = new DiskFileUpload(); Iterator iterator = items.iterator();
if (!item.isFormField()) { } catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) { // 파일 사이즈 초과시 발생하는 익셉션 |
'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 |