아래의 예제를 참고 해보시기 바랍니다. 서블릿으로 만든건데///
제가 아시는 분(신인근님)께서 작성한것입니다.
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ImageInsert extends HttpServlet {
Connection dbCon=null;
PreparedStatement stmt;
String boundary;
Hashtable valueTable;
public void init(ServletConfig conf)
throws ServletException
{
super.init(conf);
//* DB Connection
fLogin("jdbc:oracle:thin:localhost:1521:orcl", "system", "manager");
/* 먼저 SQL 골격 문장을 만든다. */
try {
// oracle 8.0.4에서는 순서가 unmatch
String mysql="INSERT INTO imagedb(title, type, ddate, description, image ) VALUES " +
"(?, ?, sysdate, ?, ?)";
stmt=dbCon.prepareStatement(mysql);
} catch(Exception e) {
System.out.println("DataBase connect failed(init) : " + e.getMessage());
return;
}
//+
}
public void destroy() {
try {
if (stmt != null) stmt.close();
if (dbCon != null) dbCon.close();
}
catch(SQLException ex) { }
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
// getContentType은 입력스트림을 통해 전송된 데이터의 컨텐츠 타입을 리턴한다.
// multipart/form-data; boundary=---------------------------7d0205382030c
String buf = req.getContentType();
// "--"에 다가 buf에서 boundary= 이후의 값을 가진다.
boundary="--"+buf.substring(buf.indexOf("boundary=")+9);
valueTable=new Hashtable();
res.setContentType("text/html; charset=euc-kr");
PrintWriter out=res.getWriter();
out.println("<HTML><HEAD><TITLE> " +
"Image Upload</TITLE></HEAD><BODY>");
// getInputStream()은 입력스트림으로부터 이진 데이터를 바이트 배열에 읽어들인다.
// POST 데이터는 단지 한 번만 읽혀질 수 있다.
int result;
byte b[]=new byte[2048];
ServletInputStream in=req.getInputStream();
// 폼 데이터의 시작 부분을 찾는다.
while (true) {
// readLine은 ServletInputStream을 가지고 있다면, 한 라인씩
// 바이트 배열로 읽어들인다.
// (입력스트림의 배열안의 0부터 시작해서 b.length 로 지정된 읽어들인
// 바이트 수가 차거나 '\n'을 접하면, 읽어드이는 과정을 멈춘다.)
// 입력스트림의 끝에 도달하면, 바이트 갯수나 -1 값을 리턴한다.
result=in.readLine(b, 0, b.length);
buf=new String(b, 0, result);
if (buf.trim().startsWith(boundary)) break;
}
// 폼 데이터의 각 부분을 처리한다.
while(parseParameter(in, out));
// DB에 등록한다.
insertImage(out);
out.println("</BODY></HTML>");
out.close();
}
/**********************************************************/
/* 기능 : Oracle DB Connection */
/* 매개변수 : (in) dsn : Database Server Name */
/* (in) uid : 사용자ID */
/* (in) pwd : 사용자Password */
/* 작성자 : 신인근 */
/* 작성일자 : 2000.12.20 */
/* 비 고 : 없음 */
/**********************************************************/
private void fLogin(String dsn, String uid, String pwd)
throws ServletException
{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
dbCon=DriverManager.getConnection(dsn, uid, pwd);
} catch(ClassNotFoundException e) {
System.out.println("Error 1 : " + e.getMessage());
} catch(Exception e) {
System.out.println("DataBase connect failed(init) : " + e.getMessage());
return;
}
}
public synchronized boolean parseParameter(ServletInputStream in, PrintWriter out)
throws IOException
{
int result;
byte b[]=new byte[2048];
String name, file, buf, value;
//*POST 입력스트림의 데이터 예제(Content-Disposition 분석)
//Content-Disposition: form-data; name="SUBMIT"
//
//UPLOAD
//-----------------------------7d01c5a2031e
//Content-Disposition: form-data; name="title"
//
//a
//-----------------------------7d01c5a2031e
//Content-Disposition: form-data; name="image"; filename="D:\JavaWebServer2.0\images\5odw.gif"
//Content-Type: image/gif
//
//GIF89a???내乷닝ㄻ憩???????짰뒈 "*뉼惺??李??螟뒈뉼?K]껸?")?酪??寧쾰墺?NSg??!내事흥ot?
// ch{EHP輅?^^SWl㎝??拐亐?$??:Ghm?닢糧耳톄Р켁搗??7B*-9뗀蠅먁IN^=@C鈑?谷학復?")
//,??%?? ?M (P'?E ??? `쿨S????D??s`?Eb?8;X? ???? 롸I????予s? !,
//
//
//?B?q??`\K?r 9?냅(쭝
//
//)??"펴r?R#EiD$?$??7??$tCM2lL?5?R???|+?h#???鰻??L응?2@&0? @0x2KP(?_a?(?;
//-----------------------------7d01c5a2031e
//Content-Disposition: form-data; name="description"
//
//sss
//-----------------------------7d01c5a2031e-- java.lang.NullPointerException:
//+
result=in.readLine(b, 0, b.length);
buf = new String(b, 0, result-2);
//* INPUT TYPE의 VALUE을 구한다.
int posName=buf.indexOf("name="");
if (posName != -1)
{
posName=posName+6;
String buf2=buf.substring(posName);
int end=buf2.indexOf('"');
name = buf2.substring(0,end);
}
else return true;
//+
//* File의 이미지명을 구한다.
int posFile=buf.indexOf("filename="");
if (posFile!=-1) {
posFile=posFile+10;
String buf2=buf.substring(posFile);
int end=buf2.indexOf('"');
file=buf2.substring(0,end);
} else file=null;
//+
if (file!=null) {
//* 이미지타입일 때 Content-Type 을 분석한다.(Content-Type: image/gif)
result=in.readLine(b, 0, b.length);
value = new String(b, 0, result);
value = value.substring(value.indexOf(':')+2);
valueTable.put("type", value.substring(0,value.length()-2));
//+
//* 이미지 데이터 파일을 구한다.
in.readLine(b, 0, b.length);
FileOutputStream fo=new FileOutputStream("image.tmp");
while(true) {
result=in.readLine(b, 0, b.length);
buf=new String(b, 0, result);
if (buf.trim().startsWith(boundary)) break;
fo.write(b, 0, result);
}
fo.close();
//+
} else {
result=in.readLine(b, 0, b.length);
value="";
while(true){
result=in.readLine(b, 0, b.length);
buf=new String(b, 0, result);
if (buf.trim().startsWith(boundary)) break;
value = value + buf;
}
valueTable.put(name, value.substring(0,value.length()-2));
}
//* 입력스트림의 최종을 결정한다.
if (buf.startsWith(boundary+"--")) return false;
else return true;
//+
}
void insertImage(PrintWriter out) {
try {
stmt.clearParameters();
String title = valueTable.get("title").toString();
if (title==null) title="Untitled";
stmt.setString(1, toAscii(title));
String type=valueTable.get("type").toString();
if (type==null) type="image/gif";
stmt.setString(2,type);
// java.util.Date date=new java.util.Date();
// to_date('20001219122034', 'yyyymmdd hh24:mi:ss');
// stmt.setDate(3, new java.sql.Date(date.getTime()));
// 4000byte이하는 varchar2사용
// 그 이상은 ascii string은 long또는 clob
// 그 이상은 binary는 long raw 또는 blob
// long 은 select는 getString
// long 은 update,insert 때는
String desc=valueTable.get("description").toString();
if (desc==null) desc = "No description";
// stmt.setString(3, toAscii(desc)); 도 가능하지만 변수범위에 의하여
// 4000byte 정도만 처리된다.
StringReader is = new StringReader(desc);
stmt.setCharacterStream(3, is, desc.length());
File imageFile=new File("image.tmp");
FileInputStream image = new FileInputStream(imageFile);
stmt.setBinaryStream(4, image, image.available());
stmt.executeUpdate();
dbCon.commit();
out.println("등록완료");
out.flush();
image.close();
imageFile.delete();
}
catch (SQLException ex) {
out.println(ex);
}
catch (FileNotFoundException ex) {
out.println(ex);
}
catch (IOException ex) {
out.println(ex);
}
catch (Exception ex) {
out.println(ex);
}
}
public static String toAscii(String s) {
String h=null;
try {
h=new String(s.getBytes("euc-kr"), "8859_1");
}
catch (UnsupportedEncodingException e) { }
return h;
}
}