Apache Upload 02
업로드된 파일과 관련된 정보를 Oracle 데이터베이스에 저장하기 위한 로직을 정의한다. PdsDAO 라는 클래스를 새로 작성하여 Author, Description, Filename 속성을 갖게 하고 insert()메소드를 이용하여 데이터베이스에 저장하게 한다. Connection Pool을 사용하기 위해 Eclipse 3.3 Project Explorer의 META-INF/context.xml 파일에 DataSource 를 설정해 주어야 한다.
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource"
username="scott" password="tiger"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:ORA9I"
maxActive="20"/>
</Context>
pds.sql
num number not null primary key,
name varchar2(10),
descr varchar2(200),
filename varchar2(20),
up_date date
)
pds_num.sql
start with 1
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
NOCACHE
apacheUpload.jsp
<%@ page contentType="text/html;charset=KSC5601"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.File" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.io.FilenameUtils"%>
<html><head> <title> Apache ServletFileUpload example </title></head>
<body>
<center><table>
<tr><td><h1>파일 업로드 결과 </h1></td></tr>
<tr><td>
<%
String author = null;
String descr = null;
String fileName=null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
}else {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
out.println("에러 1: "+e);
}
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if (item.isFormField()) { // 파일이 아닌 폼필드에 입력한 내용을 가져옴.
if(item!=null && item.getFieldName().equals("name")) {
String name = item.getString("KSC5601");//form field 안에 입력한 데이터를 가져옴
out.println("전송자:"+name+"<br>");
author = name;
}else if(item!=null && item.getFieldName().equals("desc")) {
String desc = item.getString("KSC5601");
out.println("파일에 대한 설명:"+desc+"<br>");
descr = desc;
}
} else { // 폼 필드가 아니고 파일인 경우
try {
String itemName = item.getName();//로컬 시스템 상의 파일경로 및 파일 이름 포함
System.out.println("itemName:"+itemName);
System.out.println("fieldName:"+item.getFieldName());
if(itemName==null || itemName.equals("")) continue;
fileName = FilenameUtils.getName(itemName);// 경로없이 파일이름만 추출함
System.out.println("fileName:"+fileName);
// 데이터베이스에 저장하기 위한 클래스
new upload.PdsDAO(author, descr, fileName).insert();
// 전송된 파일을 서버에 저장하기 위한 절차
File savedFile = new File("D:/upload/"+fileName);
item.write(savedFile);// 지정 경로에 파일을 저장함
out.println("<tr><td><b>저장된 파일</b></td></tr>");
out.println("<tr><td><b><a href=\"DownloadServlet?file="+fileName+"\">"+fileName+"</a></td></tr>");
} catch (Exception e) {
out.println("서버에 파일 저장중 에러: "+e);
}
}
}
}
%>
</table>
</center>
</body></html>
PdsDAO.java
package upload;
import java.sql.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class PdsDAO {
private String name, descr, fileName;
public PdsDAO(String name, String descr, String fileName) {
this.name=name;
this.descr=descr;
this.fileName=fileName;
}
public void insert() throws javax.naming.NamingException, java.sql.SQLException {
Context initCtx = new InitialContext();
/*
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
*/
DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/myoracle");
Connection conn = ds.getConnection();
String sql = "insert into pds values(pds_num.nextval, ?,?,?,sysdate)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, descr);
pstmt.setString(3, fileName);
pstmt.executeUpdate();
pstmt.close();
conn.close();
}
}