Studying/Java

[JAVA] JDK 실습 (4)

Kim Da Ham 2022. 8. 21. 17:56

2022-08-18

파일 업로드 실습

  • 시작하기 전에...
  • 각 파일들의 Statement → PrepareStatement로 바꾸기

 

 

JAVA 코드 작성

 

testWriteSave.jsp - 데이터 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="./ssi.jsp" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.*"%>

 

 

제목, 급여, 코드를 url 파라미터로부터 가져와 정상적으로 저장되는지 출력해본다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[testWriteSave.jsp]</title>
</head>
<body>
    <p>
    <img src="./images/bear.gif">
    <h2>testWriteSave.jsp</h2>
    
    <%
        Gtitle = request.getParameter("title");
        Gpay = Integer.parseInt(request.getParameter("pay"));
        Gcode = Integer.parseInt(request.getParameter("code"));
        
        System.out.println("<h2>제목 데이터 = " + Gtitle);
        System.out.println("<h2>급여 데이터 = " + Gpay);
        System.out.println("<h2>코드 데이터 = " + Gcode);

 

 

 

DB에서 데이터를 저장할 쿼리문을 만든다.

msg = "insert into test(title, pay, wdate, code) values(?, ?, sysdate,
    ?)";

    try{
        PST = CN.prepareStatement(msg);
        PST.setString(1, Gtitle); // ? 매칭
        PST.setInt(2, Gpay);
        PST.setInt(3, Gcode);
        PST.executeUpdate();
        System.out.println(Gcode + "PreparedStatement 성공 처리");
        response.sendRedirect("testList.jsp");
    }catch(Exception ex){
        response.sendRedirect("testList.jsp");
        System.out.println("test테이블 저장 실패 에러 " + ex);
    }
%>
  • setString, setInt - 쿼리문의 ? 자리에 매칭할 변수를 지정한다.

 

 

아래 작은 링크 버튼도 달아준다.

<p>
    <a href="testWrite.jsp">[게시판입력화면]</a>
    <a href="testList.jsp">[게시판전체출력]</a>
    <a href="index.jsp">[index]</a>
    <p><br><br>
</body>
</html>

 

 

 

 

testEditSave.jsp - 데이터 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="./ssi.jsp" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.*"%>

 

 

이 부분은 동일하다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[testEditSave.jsp]</title>
</head>
<body>
    <p>
    <img src="./images/bear.gif">
    <h2>testEditSave.jsp</h2>
    
    <%
        String eGtitle = request.getParameter("title");
        int eGpay = Integer.parseInt(request.getParameter("pay"));
        int eGcode = Integer.parseInt(request.getParameter("code"));
        
        System.out.println("수정제목데이터 = " + eGtitle);
        System.out.println("수정급여데이터 = " + eGpay);
        System.out.println("수정코드데이터 = " + eGcode);

 

 

 

데이터를 수정하는 쿼리문을 작성한다.

msg = "update test set title=?, pay=?, wdate=sysdate where code=?";

        try{
            PST = CN.prepareStatement(msg);
            PST.setString(1, eGtitle);
            PST.setInt(2, eGpay);
            PST.setInt(3, eGcode);
            PST.executeUpdate();
            System.out.println(eGcode +"데이터 PreparedStatement 수정성공");
            response.sendRedirect("testList.jsp");
        }catch(Exception ex){
            response.sendRedirect("testList.jsp");
            System.out.println("test테이블 수정실패 에러 " + ex);
        }
    %>
</body>
</html>

 

 

 

 

 

파일 업로드를 시작하기 전 준비 단계

  • 이미지 파일을 다운로드 받을 storage 폴더 생성
    • miniBBS > 이미지 저장 경로는 아래와 같다.
      • C:\workspace\work.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\miniBBS\storage
    • Web0812 에도 똑같이 아래 경로에 storage 폴더를 생성
      • C:\workspace\work.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Web0812
    • eclipse Refresh 후 안 보이면 WebContent 오른쪽 클릭 > storage 폴더 생성

 

  • WEB-INF > lib 폴더에 cos.jar 파일을 추가
    • http://www.servlets.com/cos/
    • 위 링크에서 cos-22.05.zip 다운로드
    • C:\workspace\cos-22.05\lib 에 cos.jar 복사/붙여넣기
    • 아래 두 클래스를 import 해서 쓸 거임 
      • C:\workspace\cos-22.05\src\com\oreilly\servlet\multipart
        • DefaultFileRenamePolicy.class
      • C:\workspace\cos-22.05\src\com\oreilly\servlet
        • MultipartRequest.java

 

 

 

JAVA 코드 작성

 

AAA.jsp - 파일 입력 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>AAA.jsp</title>
 <style type="text/css">
...
 </style>
</head>
<body>
    <font size=7 color=blue> <b>AAA.jsp</b> </font> 
    <form method="post" action="BBB.jsp" enctype="multipart/form-data">
        <input type="hidden" name="sabun" value="7789"> <br>
       제목 : <input type="text" name="title" value="snow"> <br>
       파일 : <input type="file" name="fileimg"> <br>
             <input type="submit" value="파일 전송">
             <input type="reset" value="입력 취소">
    </form>
 <div id="preview">
 </div>
  
</body>
</html>
  • enctype="multipart/form-data" 
    • enctype : form 데이터가 서버로 제출될 때 해당 데이터가 인코딩 되는 방식을 지시
      1. application/x-www-form-urlencoded : 기본값. 모든 문자들은 서버로 보내기 전에 인코딩됨을 명시.
      2. multipart/form-data : 모든 문자를 인코딩하지 않음을 명시. 파일이나 이미지를 서버로 전송할 때 주로 사용.
      3. text/plain : 공백 문자(space)는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시.

 

 

 

BBB.jsp - 입력한 파일을 받는다

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.io.File" %>

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>BBB.jsp</title>
 <style type="text/css">
...
 </style>
</head>
<body>
  <h2>BBB.jsp</h2>
 
    <%
      String path = application.getRealPath("./storage");  
      System.out.println("공통저장경로" + path);

      int size = 1024*1024*7;
      DefaultFileRenamePolicy dfr = new DefaultFileRenamePolicy();

      MultipartRequest mr = new MultipartRequest(request,path,size,"UTF-8");

	  // MultipartRequest로 전송 받은 데이터를 불러온다.
      String dsabun = mr.getParameter("sabun");
      String dtitle = mr.getParameter("title");
      String dimg = mr.getFilesystemName("fileimg");
      
      out.println("넘어온사번 = " + dsabun +"<br>");
      out.println("넘어온제목 = " + dtitle +"<br>");
      out.println("넘어온파일 = " + dimg +"<br>");

      File ff = mr.getFile("fileimg");
      out.println(dimg + "파일크기는" + ff.length() + "Byte <br>");
    %> 
	
	<!-- 이미지를 클릭했을 때 이동 -->
	<a href="BBBdownload.jsp?fileName=<%=dimg%>">
		<img src="<%=request.getContextPath() %>/storage/<%=dimg %>" width=300 height=150>
	</a>&nbsp;&nbsp;

  <p>
  <a href="AAA.jsp">[AAA화면]</a>
  <a href="testWrite.jsp">[입력화면]</a>
  <a href="testList.jsp">[전체출력]</a>
  <a href="index.jsp">[index]</a>
</body>
</html>
  • String path = application.getRealPath("./storage")  -  파일이 저장 될 서버의 경로
  • MultipartRequest mr = new MultipartRequest(요청,경로,크기,인코딩,덮어쓰기옵션)
    • MultipartRequest 를 생성만 해주면 파일이 업로드 된다(파일 자체의 업로드 완료)
  • mr.getFilesystemName("fileimg")  -  전송 받은 데이터가 파일일 경우 파일 이름을 받아옴

 

 

 

 

 

 

BBBdownload.jsp - 이미지를 클릭하면 이미지 다운로드 한다. (response 내장 객체를 활용한다.)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.*" %>
<%@ page import="java.net.URLEncoder" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>BBBdownload.jsp</title>
<style type="text/css">
	* { font-size:20pt;  }
    a { font-size:20pt; text-decoration:none ;font-weight:bold; }
    a:hover{ font-size:24pt; text-decoration:underline ; color:blue ;}
    body{margin-left:10px;}
</style>
</head>
<body>
	<h2>BBBdownload.jsp</h2>
    
	<%
		//miniBBS폴더/filedownload.jsp 문서 참고
		String path = application.getRealPath("./storage");
		System.out.println("공통저장경로"+path);
		String Gdata = request.getParameter("fileName");
		System.out.println("다운로드 대상 파일 이름"+Gdata);
		
		//팝업창 자바스크립트 window.open("파일명", "표식", "가로, 높이, left, top")
		response.setHeader("Content-Disposition", "attachment;filename="+Gdata);
		try{
			File file = new File(path, Gdata);
			InputStream is = new FileInputStream(file); // Byte 단위로 넘김
			OutputStream os = response.getOutputStream();
			
			//C, java, C# 표준 데이터타입 int, char, boolean, byte, float
			long size = file.length();
			byte[] bt = new byte[(int)size];
			is.read(bt, 0, bt.length);
			os.write(bt);
			
			is.close(); os.close();
		}catch(Exception ex){}
	%>
    
	<p>
	<a href="BBB.jsp">[AAA화면]</a>
	<a href="BBB.jsp">[BBB화면]</a>
	<a href="testWrite.jsp">[게시판입력화면]</a>
  	<a href="testList.jsp">[게시판전체출력]</a>
  	<a href="index.jsp">[index]</a>
</body>
</html>

 

 

이미지가 저장 된다~~~