○ SQL
- 포토갤러리 테이블(tb_pds) 생성
CREATE TABLE tb_pds (
pdsno NUMBER NOT NULL
,wname VARCHAR2(100) NOT NULL
,subject VARCHAR2(250) NOT NULL
,regdate DATE NOT NULL
,passwd VARCHAR2(15) NOT NULL
,readcnt NUMBER DEFAULT 0
,filename VARCHAR2(250) NOT NULL --파일명
,filesize NUMBER DEFAULT 0 --파일크기
,PRIMARY KEY(pdsno)
);
- 시퀀스(pds_seq) 생성
CREATE sequence pds_seq;
- 행 추가
INSERT INTO tb_pds(
pdsno, -- 시퀀스
wname, -- 글쓴이(사용자 입력)
subject, -- 글제목(사용자 입력)
passwd, -- 비밀번호(사용자 입력)
filename, -- 첨부파일명
filesize, -- 첨부파일크기
regdate -- 등록일(오늘날짜)
) VALUES(pds_seq.nextval, ?, ?, ?, ?, ? sysdate);
○ 공통코드
- ssi.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="net.utility.*" %>
<%@ page import="net.pds.*" %>
<%@page import="java.io.File"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<jsp:useBean id="dao" class="net.pds.pdsDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.pds.PdsDTO" scope="page"></jsp:useBean>
<% request.setCharacterEncoding("UTF-8"); %>
○ 데이터 전송 객체 (DTO; Data Transfer Object)
- PdsDTO.java
package net.pds;
public class PdsDTO {
private int pdsno;
private String wname;
private String subject;
private String regdate;
private String passwd;
private int readcnt;
private String filename;
private long filesize; //파일사이즈는 숫자가 쉽게 커지기 때문에 long형으로
public PdsDTO() { }
public int getPdsno() {
return pdsno;
}
public void setPdsno(int pdsno) {
this.pdsno = pdsno;
}
public String getWname() {
return wname;
}
public void setWname(String wname) {
this.wname = wname;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public int getReadcnt() {
return readcnt;
}
public void setReadcnt(int readcnt) {
this.readcnt = readcnt;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public long getFilesize() {
return filesize;
}
public void setFilesize(long filesize) {
this.filesize = filesize;
}
@Override
public String toString() {
return "PdsDTO [pdsno=" + pdsno + ", wname=" + wname + ", subject=" + subject
+ ", regdate=" + regdate + ", passwd=" + passwd + ", readcnt=" + readcnt
+ ", filename=" + filename + ", filesize=" + filesize + "]";
}
}
○ 파일업로드
① 파일첨부 폼 : pdsTest.jsp
- 파일첨부를 위해 <form>에 enctype="multipart/form-data"속성 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>pdsTest.jsp</title>
</head>
<body>
<h3>파일 첨부 테스트</h3>
<form method="post" action="pdsTestProc.jsp" enctype="multipart/form-data">
이름 : <input type="text" name="uname"> <br>
제목 : <input type="text" name="subject"> <br>
내용 : <textarea rows="5" cols="20" name="content"></textarea> <br>
첨부 : <input type="file" name="filenm"> <br>
<input type="submit" value="전송">
</form>
</body>
</html>
② 파일첨부 프로세스 : pdsTestProc.jsp
- "multipart/form-data"속성이 추가되면 request 객체의 값을 제대로 가져올 수 없다 (null 반환)
- MultipartRequest 객체를 이용해야 함
- 열거형(Enumeration) → Enumeration enum={"KIM", "PARK", "LEE"}
<%@page import="java.io.File"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>pdsTestProc.jsp</title>
</head>
<body>
<h3>파일 첨부 테스트</h3>
<%
try{
//1)첨부된 파일 저장하기
//첨부된 파일을 저장하는 폴더 생성 src/main/webapp/storage
//실제 물리적인 경로
String saveDir=application.getRealPath("/storage");
//저장 최대용량 (10M)
int maxSize=1024*1024*10;
//한글인코딩
String encoding="UTF-8";
MultipartRequest mr
= new MultipartRequest(request, saveDir, maxSize, encoding, new DefaultFileRenamePolicy());
//2)mr참조변수가 가리키고 있는 텍스트 정보 가져오기
out.print(mr.getParameter("uname"));
out.print("<br>");
out.print(mr.getParameter("subject"));
out.print("<br>");
out.print(mr.getParameter("content"));
out.print("<hr>");
//3) /storage 폴더에 저장된 파일 정보 확인하기
// ① mr에서 <input type="file" name="filenm">을 전부 수거하기
// 만일 첨부된 파일이 3개였다면
// files={<input type="file">, <input type="file">, <input type="file"> }
Enumeration files=mr.getFileNames();
// ② ①의 files가 가지고 있는 값들중에서 개별적으로 접근하기 위해 name 가져오기
String item=(String)files.nextElement();
// ③ ②의 item에 담긴 실제 파일을 mr객체에서 가져오기
String ofileName=mr.getOriginalFileName(item);
out.print("원본 파일명 : " + ofileName);
out.print("<br>");
String fileName=mr.getFilesystemName(item);
out.print("리네임 파일명 : " + fileName);
out.print("<hr>");
// ④ /storage 폴더에 저장된 파일의 기타 정보 확인하기
File file=mr.getFile(item);
if(file.exists()){//파일이 존재하는지?
out.print("파일명 : " + file.getName());
out.print("<br>");
out.print("파일크기 : " + file.length() + "byte");
out.print("<hr>");
}else{
out.print("해당 파일이 존재하지 않음");
}
}catch(Exception e){
out.println("<p>파일 업로드 실패 :" + e + "</p>");
out.println("<p><a href='javascript:history.back()'>뒤로 가기</a></p>");
}
%>
</body>
</html>
'Project > myweb_JAVA' 카테고리의 다른 글
10. 회원 관리 ④ (아이디비밀번호찾기, 회원 탈퇴) (1) | 2022.09.20 |
---|---|
09. 회원 관리 ③ (회원가입, 다음 우편번호 API) (1) | 2022.09.19 |
08. 회원 관리 ② (세션, 쿠키, 로그인, 로그아웃 ) (0) | 2022.08.03 |
07. 회원 관리 ① (테이블 생성, DTO, DAO, 공통코드) (0) | 2022.08.02 |
06. 답변형 게시판 ④ (게시글 리스트 페이징, 게시글 검색) (0) | 2022.07.27 |
댓글