본문 바로가기
Project/myweb_JAVA

11. 포토갤러리 ① (테이블 생성, DTO, 파일업로드, MultipartRequest)

by 개발개발빈이 2022. 9. 28.

○ 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>

댓글