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 폴더 생성
- miniBBS > 이미지 저장 경로는 아래와 같다.
- 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
- C:\workspace\cos-22.05\src\com\oreilly\servlet\multipart
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 데이터가 서버로 제출될 때 해당 데이터가 인코딩 되는 방식을 지시
- application/x-www-form-urlencoded : 기본값. 모든 문자들은 서버로 보내기 전에 인코딩됨을 명시.
- multipart/form-data : 모든 문자를 인코딩하지 않음을 명시. 파일이나 이미지를 서버로 전송할 때 주로 사용.
- text/plain : 공백 문자(space)는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시.
- enctype : form 데이터가 서버로 제출될 때 해당 데이터가 인코딩 되는 방식을 지시
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>
<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>