** 파일 업로드
: 클라이언트가 선택한 파일을 서버에 복사하기 위한 기능을
개발자가 직접 파일 복사 프로그램을 처리할 수도 있지만
이미 만들어진 라이브러리를 사용하자
==> 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"); <== 이것은 바람직 하지 않다.
'JAVA > JSP' 카테고리의 다른 글
JSP - 답변형 게시판을 위한 칼럼 추가 (0) | 2016.07.03 |
---|---|
JSP - 프로젝트 복사할 때 서버 오류 나는 경우 (0) | 2016.07.03 |
JSP - 액션태그 관련 설명 및 예제 (0) | 2016.06.18 |
JSP - JSTL 정의 및 다운로드, 사용유무 비교예제 (0) | 2016.06.18 |
JSP - (Servlet) 서블릿 설명 및 예제 (doGET, doPOST) (2) | 2016.06.18 |