-
[JAVA] JDK 실습 (4)Studying/Java 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>
'Studying > Java' 카테고리의 다른 글
[JAVA] JDK 실습 (6) (0) 2022.08.28 [JAVA] JDK 실습 (5) (0) 2022.08.21 [JAVA] JDK 배포 파일 만들기/실행하기 (0) 2022.08.21 [JAVA] JDK 실습 (3) (0) 2022.08.21 [JAVA] JDK 실습 (2) (0) 2022.08.16