본문 바로가기

JAVA/JSP

JSP - 파일업로드 설명(cos.jar 이용) 및 예제

반응형


** 파일 업로드

: 클라이언트가 선택한 파일을 서버에 복사하기 위한 기능을 

개발자가 직접 파일 복사 프로그램을 처리할 수도 있지만

이미 만들어진 라이브러리를 사용하자

==> cos.jar



**cos.jar

http://www.servlets.com/

com.oreilly.servlet

download - version - cos-26Dec2008.zip

다운로드 및 압축풀기

C:\Users\USER\Downloads\cos-26Dec2008\lib

안에 있는 cos.jar 파일 있음

cos.jar 를 day0412-WebContent-WEB-INF-lib 에 끌어놓음



** 파일업로드

<form action="InsertGoods" method="post">

상품명 : <input type="text" name="item"><br>

가격 : <input type="text" name="price"><br>

상세설명 : <br>

<textarea rows="5" cols="60"></textarea><br>

상품이미지 : <input type="file" name="img"><br> 

<input type="submit" value="등록"><br>

<input type="reset" value="취소"><br>

</form>




** 주의사항

클라이언트가 업로드한 파일을 복사할 폴더를 서버에 마련해야 한다.


업로드 할 폴더를 만들어야 하는데

단순 업로드 목적으로는 아무대나 만들어도 상관없음

하지만 업로드 한 파일을 클라이언트에 서비스 해야하기 때문에

서버의 아무대나 하면 곤란함

폴더 위치

현재 웹어플리케이션을 기준으로 폴더를 만들어야함

WebContent - new Folder - upload


예를 들어 만약 서버의 c:\upload 폴더를 생성하여 여기에 상품이미지를 복사 했다고 가정하자

사용자 화면에 상품이미지를 출력하기 위해서 

<img src="c:/upload/apple.jpg" 라고 표현해야 할 텐데

모든 클라이언트들의 하드디스크에 c:/upload라는 폴더는 없다!!!!!!!!



** 파일 업로드(파일복사)를 하려면 form 태그에 다음과 같이 써준다.

이전처럼 텍스트로 실고가면 파일복사가 불가능 하다

그렇기에 

<form action="InsertGoods" method="post"> 여기에

<form action="InsertGoods" method="post" enctype="multipart/form-data">

속성을 추가한다.



** 파일업로드 예제 (cos.jar 라이브러리를 이용한 것)


insertGoods.jsp

<body>

<h2>상품 등록</h2>

<hr>


<!-- action에는 jsp 나 servlet 둘중 하나가 올수 있음 -->

<form action="InsertGoods" method="post" enctype="multipart/form-data">

상품명 : <input type="text" name="item"><br>

가격 : <input type="text" name="price"><br>

상세설명 : <br>

<textarea rows="5" cols="60" name="detail"></textarea><br>

상품이미지 : <input type="file" name="img"><br> 

<input type="submit" value="등록"><br>

<input type="reset" value="취소"><br>

</form>

</body>



GoodsDao

public int insertGoods(GoodsVo g){

int re = -1;

String sql = "insert into goods values(seq_goods.nextval,?,?,?,?)";


Connection conn = null;

PreparedStatement pstmt = null;


try {

conn = ConnectionProvider.getConnection();

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, g.getItem());

pstmt.setInt(2, g.getPrice());

pstmt.setString(3, g.getDetail());

pstmt.setString(4, g.getImg());

re = pstmt.executeUpdate();


} catch (Exception e) {

System.out.println(e);

} finally {

ConnectionProvider.close(null, pstmt, conn);

}


return re;

}



GoodsVo

private int no;

private String item;

private int price;

private String detail;

private String img;


에 대한 갖자기 세터,게터, 생성자 등



InsertGoods.java (서블릿)

package com.hanb.servlet;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.hanb.dao.GoodsDao;

import com.hanb.vo.GoodsVo;

import com.oreilly.servlet.MultipartRequest;


/**

* Servlet implementation class InsertGoods

*/

@WebServlet("/InsertGoods")

public class InsertGoods extends HttpServlet {

private static final long serialVersionUID = 1L;


/**

* @see HttpServlet#HttpServlet()

*/

public InsertGoods() {

super();

// TODO Auto-generated constructor stub

}


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

//response.getWriter().append("Served at: ").append(request.getContextPath());

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

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

// TODO Auto-generated method stub

//doGet(request, response);

// 늘 언제라도 문자셋을 설정해준다.

//request.setCharacterEncoding("UTF-8");


// 파일 업로드 => 클라이언트가 선택한 파일을 서버의 하드디스크에 복사하는 기능

// 이러한 기능을 수행 하려면 알아햐 하는 것들

// 1. 목적지(어디로 복사할 것인지) 경로 설정

// 현재 웹어플리케이션을 기준으로 upload폴더를 만들어 두었다.

// 실제 경로는 request 를 통해서 알아온다.

String path = request.getRealPath("/upload");


//System.out.println("path:"+ path);

// 결과 ==> 

//path :C:\jspStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\day0412밑에upload 


//파일경로가 잘 생성되는지 확인하기 위해 만들어 놓음

// 또한 현재 저 밑에 else에 해당하는 문서가 없기에 문자를 쓰기 위해 사용

// request.setCharacterEncoding("UTF-8"); 이렇게 따로하던것을 

// 밑에처럼 response.setContentType("text/html;UTF-8"); 이렇게 사용해도 무방하다.

response.setContentType("text/html; charset=UTF-8");

PrintWriter out = response.getWriter();

//out.println("path :"+ path);



// 2. 클라이언트가 선택한 파일을 서버에 복사하기 위해서는

// cos.jar가 제공하는 MultipartRequest를 생성한다.

// 여기까지는 파일업로드만 가능한 상황이다.

MultipartRequest multi = new MultipartRequest(request, path);


//MultipartRequest 객체를 생성한 순간 서버에 하드디스크에 파일복사가 일어난다.

// 나머지 사용자의 입력값을 받아온다.

// request를 이용하지 않고 MultipartRequest 객체를 통해 받아온다.

GoodsVo g = new GoodsVo();

g.setItem(multi.getParameter("item"));

g.setPrice(Integer.parseInt(multi.getParameter("price")));

g.setDetail(multi.getParameter("detail"));


// <form action="InsertGoods" method="post" enctype="multipart/form-data">

// form 태그에 위처럼 되어있을때 

// <input type="file" name="img">

// 로부터 받아 오는 것을 파일이름이 아니라 img에 실려오는 것은 파일의 내용이 실려온다.

// 그래서 다른것처럼 multi.getParameter로 가져오는 것이아니라

// multi.getFilesystemName("img"); 를 이용하여 업로드한 파일명을 알아 온다.

g.setImg(multi.getFilesystemName("img"));


// 가져온 것을 다 했기에 dao에게 일처리를 맡김

GoodsDao dao = new GoodsDao();

int re = dao.insertGoods(g);


if(re ==1){

out.println("성공");

}else{

out.println("실패");

}


}


}




** 파일업로드 했던 것 뿌려보기


ex02.jsp

<body>

<!-- 현재 어플리케이션을 기준으로 해줌 -->

<img src="upload/apple.jpg">

</body>



** 파일찾기버튼을 생성하기 위한 방법

 : 실제로 파일복사는 이루어지지 않고 파일을 선택할 수 있는 모양만 제공


<form action="" method="" encType="multipart/form-data">

<input type="file">

</form>


** 파일복사를 위한 방법

MultipartRequest multi = new MultipartRequest(request, "경로명");


** 주의사항

파일을 서버에 하드디스크에 복사할 "경로명"은 만약에 그 파일을 보관만 할 것이라면 서버의 어디에 저장하더라도 관계없지만 

그러나 그 문서를 다시 사용자들(모든 클라이언트들)의 웹브라우저에 다시 서비스를 해야 할 파일이라면 반드시 웹 어플리케이션을 기준으로 업로드 할 폴더를 생성해야 한다.

만약 서버의 하드디스크에 "c:\upload" 폴더를 생성하여 파일복사를 했다면 모든 클라이언트의 c:\upload 폴더에 파일이 존재 하지 않는다.


그래서, 업로드 폴더는 웹어플리케이션을 기준으로 폴더를 생성해야 하고 실제 파일복사를 하기 위해서는 이경로의 실제 경로를 알아와야 한다.

-알아오는 방법

 : String path =  request.getRealPath("경로명");


MultipartRequest multi = new MultipartRequest(request, "경로명");

MultipartRequest multi = new MultipartRequest(request, "path"); <== 이렇게 들어와야 한다. path는 getRealPath의 변수

MultipartRequest multi = new MultipartRequest(request, "\upload"); <== 이것은 바람직 하지 않다.


반응형