자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 35. 파일 업로드 및 다운로드 - 라이브러리 추가하기, 파일 업로드

개발학생 2025. 4. 24. 17:31
반응형

*이 글을 쓰는 시점부터는 노트북이 고장나는 바람에.. 다른 분의 글과 이전에 올렸던 글들을 참고하여, 다른 데스크탑의 윈도우 환경에 환경설정을 다시 진행한 후 작성하였습니다. 환경설정 관련 글들은 아래를 참고해 주세요.

  • JDK11 설치 및 환경 변수(JAVA_HOME) 설정 - CLASSPATH는 추가하지 않음
 

자바(JAVA) 11 설치 및 환경설정 | 자바 11 환경 변수

자바로 코딩 공부를 하려면 개발 할 수 있는 환경을 만들어 주어야 한다. 그 순서를 먼저 작성하자면JAVA SE JDK 설치 -> JAVA 환경 변수 설정 -> IDE 설치 이렇게 볼 수 있겠다. 이 포스팅은 자바로 개

velog.io

  • 톰캣 설치, 이클립스 설치 - 이 글을 쓰는 시점에서는 Tomcat 8버전이 없어, Tomcat 9버전 설치
 

JSP) JDK, 이클립스(eclipse), 톰캣 설치 및 환경 설정

1. JDK 설치 → Path 설정 2.eclipse JAVA EE버전 다운로드 3.웹컨테이너 톰캣 설치 →톰캣 환경설정 1. JDK 설치 - JAVA) 1. JDK 참고하여 설치하고 설정한다. -https://storyblogger.tistory.com/15?category=984696 2. 구글에

storyblogger.tistory.com

  • 이클립스 JDK 버전 설정 - JDK11로 설정
 

[이클립스] JDK 버전 바꾸는 법

스프링을 사용하는 에러가 난다? 그러면 JRE 버전을 확인해보자! 프로젝트의 JRE System Library의 오른쪽을 살펴보면 [JavaSE-17]이라고 되어있다. 스프링이나 하이버네이트를 사용할 때, 자바 8이나 자

myvelop.tistory.com

  • JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치 및 JDK 버전 설정 이후~ ⇒ 톰캣 버전과 jsp 파일 경로는 글 내용과 다르게 아래 이미지와 같음

 

JAVA/JSP 1. 개발 환경 구축 - 이클립스 기본 설정

*JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치를 완료한 상태OpenJDK 11: 자바 프로그램을 컴파일하고 실행해주는 기본 도구*이클립스 JDK-17이 설치되어있어서, https://coding-house.tisto

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - JSP 예제 테스트

1. 프로젝트 생성1) [File] → [New] → [Dynamic Web Project] 선택 2) 프로젝트 설정 화면 → Project name: HelloJSP, Target runtime: Apache Tomcat v9.0, Dynamic web module version: 4.0으로 설정 후 Next 클릭 3) 자바 소스 파일

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - 마지막 추가 설정

1. 외부 웹 브라우저로 실행하기-크롬이클립스는 웹 애플리케이션 실행 시, 자체 브라우저를 통해 실행 결과 출력웹 애플리케이션 배포 시 사용자는 크롬/파이어폭스 같은 전용 웹 브라우저로

keep-programming-study.tistory.com

  • 오라클(Oracle Database 11gR2 Express Edition) 설치 및 설정 
 

JAVA/JSP 14. 데이터베이스 - 특징, 오라클 설치(Oracle Database 11gR2 Express Edition), 사용자 계정 생성 및

1. 데이터베이스의 특징우리가 매일 PC나 스마트폰을 통해 접하는 거의 모든 웹 애플리케이션에서 사용함매일 업데이트되는 뉴스나 날씨 등의 정보는 데이터베이스가 없다면 클라이언트에 전달

keep-programming-study.tistory.com

 

 

 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

JAVA/JSP 16. 데이터베이스 - 커넥션 풀로 성능 개선, 간단한 쿼리 작성 및 실행

6. 커넥션 풀로 성능 개선웹은 클라이언트의 요청에 서버가 응답하는 구조→ Connection 객체 생성 때마다 네트워크 통신이 이뤄지며, 시간이 걸리는 작업들이 수반됨 == 시스템 성능에 큰 영향을

keep-programming-study.tistory.com

  • 시퀀스 설정
 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

1. 라이브러리 추가하기

  • cos 라이브러리 추가 필요
    1. http://servlets.com/cos/ 배포 사이트에 접속 후 아래로 스크롤하여 다운로드 링크 클릭
    2. 다운로드한 파일의 압축 풀고 cos.jar 파일 찾기
    3. 이클립스의 {프로젝트 루트}/src/main/webapp/WEB-INF/lib 폴더로 드래그 앤 드롭하여 복사

2. 파일 업로드

1) 화면(폼) 작성

  • method 속성은 post로, enctype 속성은 3가지 중 multipart/form-data로 지정해야 함
속성값  설명
application/x-www-form-urlencoded 모든 문자를 서버로 전송하기 전에 인코딩(기본값)
multipart/form-data 모든 문자를 인코딩하지 않으며, 파일을 서버로 전송할 때 사용
text/plain 공백 문자(space)만 “+” 기호로 변환하고, 나머지 문자는 인코딩하지 않음

 

업로드용 폼 화면

// /src/main/webapp/FileUploadMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>FileUpload</title></head>
<script>
  function validateForm(form) {    // 1.
    if (form.name.value == "") {
      alert("작성자를 입력하세요.");
      form.name.focus();
      return false;
    }
    if (form.title.value == "") {
      alert("제목을 입력하세요.");
      form.title.focus();
      return false;
    }
    if (form.attachedFile.value == "") {
      alert("첨부파일은 필수 입력입니다.");
      return false;
    }
  }
</script>
<body>
  <h3>파일 업로드</h3>
  <span style="color: red;">${errorMessage}</span>
  <form name="fileForm" method="post" enctype="multipart/form-data"
        action="UploadProcess.jsp" onsubmit="return validateForm(this);">    // 2.
      작성자: <input type="text" name="name" value="헬로" /><br />    // 3.(아랫줄까지)
      제목: <input type="text" name="title" /><br />
      카테고리(선택사항):
        <input type="checkbox" name="cate" value="사진" checked />사진
        <input type="checkbox" name="cate" value="과제" />과제
        <input type="checkbox" name="cate" value="워드" />워드
        <input type="checkbox" name="cate" value="음원" />음원 <br />    // 4.
      첨부파일: <input type="file" name="attachedFile" /> <br />    // 5.
      <input type="submit" value="전송하기" />    // 6.
  </form>
</body>
</html>
  1. 작성폼의 입력값을 검증하기 위한 자바스크립트 함수: 작성자 이름/제목/첨부파일이 입력되었는지 확인하고, 입력되지 않았다면 경고창을 띄우고 해당 입력란으로 포커스 이동 후 전송 취소를 위해 false 반환
  2. method는 post로, enctype은 multipart/form-data로 설정한 후 입력값 검증을 위해 onsubmit 이벤트 핸들러에서 1의 함수를 호출
  3. 작성자와 제목을 입력하기 위한 input 상자(필수 입력 사항)
  4. 카테고리를 선택하기 위한 input 상자: type을 체크박스로 지정하여 여러 개 값을 동시에 전송할 수 있으며, 선택사항이므로 폼값을 검증하지 않음
  5. 첨부파일 선택을 위한 input 상자: type을 file로 지정하여 버튼을 누르면 파일 선택이 가능한 창을 띄워줌
  6. type이 submit인, 클릭하면 폼값을 전송해주는 버튼

2) 데이터베이스에 테이블 생성

  • myfile 테이블 정의서
컬럼명 데이터타입  null 허용  키  기본값  설명
idx number N 기본키   일련번호. 기본키
name varchar2(50) N     작성자
title varchar2(200) N     제목
cate varchar2(30)       카테고리
ofile varchar2(100) N     원본 파일명(original filename)
sfile varchar2(30) N     저장된 파일명(saved filename)
postdate date N   sysdate 등록한 날짜

(1) 윈도우키 + R키를 눌러 실행창을 띄우고, “cmd”를 입력해 명령 프롬프트 실행

(2) sqlplus 명령으로 오라클 데이터베이스에 접속 → 사용자이름: hello, 비밀번호: 1234

(3) 명령 프롬프트에 다음 쿼리문을 입력하여 테이블 생성
ERROR at line 8: ORA-02263: need to specify the datatype for this column’ 발생
⇒ 오타로 인해 postdate에 데이터타입을 아예 지정하지 않고 테이블을 만들려 했기 때문에 발생함

create table myfile (
  idx number primary key,
  name varchar2(50) not null,
  title varchar2(200) not null,
  cate varchar2(30),
  ofile varchar2(100) not null,
  sfile varchar2(30) not null,
  postdate date default sysdate not null
);

(4) desc 명령으로 테이블이 정상적으로 생성되었는지 확인: desc myfile

3) DTO 및 DAO 클래스 생성 - HelloJSP 프로젝트의 Java Resources/src 경로에 fileupload 패키지를 생성한 후 작성

DTO 클래스

  • 게터/세터는 이클립스의 [Source] → [Generate Getters and Setters] 메뉴로 자동 생성
// /Java Resources/src/fileupload/MyfileDTO.java
package fileupload;

public class MyfileDTO {
  // 1. 멤버 변수
  private String idx;    
  private String name;    // 작성자 이름
  private String title;    // 제목
  private String cate;    // 카테고리
  private String ofile;    // 원본 파일명
  private String sfile;    // 저장된 파일명
  private String postdate;    // 등록 날짜
	
  // 2. 게터/세터
  public String getIdx() {
    return idx;
  }
  public void setIdx(String idx) {
    this.idx = idx;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getCate() {
    return cate;
  }
  public void setCate(String cate) {
    this.cate = cate;
  }
  public String getOfile() {
    return ofile;
  }
  public void setOfile(String ofile) {
    this.ofile = ofile;
  }
  public String getSfile() {
    return sfile;
  }
  public void setSfile(String sfile) {
    this.sfile = sfile;
  }
  public String getPostdate() {
    return postdate;
  }
  public void setPostdate(String postdate) {
    this.postdate = postdate;
  }
}

DAO 클래스

// /Java Resources/src/fileupload/MyfileDAO.java
package fileupload;

import common.DBConnPool;

public class MyfileDAO extends DBConnPool {    // 1.
  // 새로운 게시물 입력 메서드
  public int insertFile(MyfileDTO dto) {    // 2.
    int applyResult = 0;    // 3.
    try {
      String query = "INSERT INTO myfile ( " 
                  + " idx, name, title, cate, ofile, sfile) "
	              + "VALUES ("
                  + "seq_board_num.nextval, ?, ?, ?, ?, ?)";    // 4.
			
      psmt = con.prepareStatement(query);     // 5.
      psmt.setString(1, dto.getName());    // 6.
      psmt.setString(2, dto.getTitle());
      psmt.setString(3, dto.getCate());
      psmt.setString(4, dto.getOfile());
      psmt.setString(5, dto.getSfile());
			
      applyResult = psmt.executeUpdate();    // 7.
    } catch (Exception e) {
      System.out.println("INSERT 중 예외 발생");
      e.printStackTrace();
    }
    return applyResult;
  }
}
  1. 커넥션 풀 사용을 위해 DBConnPool을 상속
  2. 새로운 게시물을 입력하기 위한 메서드: 매개변수로 DTO 객체를 받으며, 작성폼을 통해 전송된 값을 DTO에 저장한 후 insertFile() 메서드의 인수로 전달됨
  3. INSERT 쿼리문 실행 후 적용된 행의 개수를 저장하기 위한 변수 생성(변수의 값은 7에서 할당됨)
  4. INSERT 쿼리문을 작성: 시퀀스는 seq_board_num을 사용
  5. PreparedStatement 객체를 생성
  6. ?로 지정된 인파라미터 설정(DTO 객체의 Getter 메서드 사용)
  7. 쿼리문 실행 시 적용된 행의 개수가 정수로 반환(1이면 성공, 0이면 실패)

4) 파일 업로드 및 폼값 처리

  • (1)에서 추가한 확장 라이브러리에는 MultipartRequset라는 클래스가 존재하는데, 생성자 중 다음의 네 가지 값을 받는 생성자를 이용
public MultipartRequest(HttpServlet requset,    // request 내장 객체
                        String saveDirectory,    // 파일이 저장될 디렉터리의 물리적 경로
                        int maxPostSize,    // 업로드할 파일의 최대 용량
                        String encoding)    // 인코딩 방식
  • 프로젝트 루트}/src/main/webapp 하위에 Uploads라는 폴더를 생성
    • Uploads 폴더를 우클릭하고 [New] → [File] 메뉴를 선택해 “업로드폴더”라는 빈 파일을 하나 생성

  • 파일 업로드를 처리하는 JSP 파일
// /src/main/webapp/UploadProcess.jsp
<%@ page import="fileupload.MyfileDAO" %>
<%@ page import="fileupload.MyfileDTO" %>
<%@ page import="java.util.Date"%>
<%@ page import="java.io.File"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 1.
String saveDirectory = application.getRealPath("/Uploads");    // 저장할 디렉토리
int maxPostSize = 1024 * 1000;    // 파일 최대 크기(1MB)
String encoding = "UTF-8";    // 인코딩 방식

try {
  // 2. MultipartRequest 객체 생성
  MultipartRequest mr = new MultipartRequest(request, saveDirectory, maxPostSize, encoding);
	
  // 3. 새로운 파일명 생성
  String fileName = mr.getFilesystemName("attachedFile");    // 현재 파일 이름
  String ext = fileName.substring(fileName.lastIndexOf("."));    // 파일 확장자
  // 4. 
  String now = new SimpleDateFormat("yyyyMMdd_HmSS").format(new Date());
  String newFileName = now + ext;    // 새로운 파일 이름("업로드일시.확장자")
	
  // 5. 파일명 변경
  File oldFile = new File(saveDirectory + File.separator + fileName);
  File newFile = new File(saveDirectory + File.separator + newFileName);
  oldFile.renameTo(newFile);    // 6.
	
  // 7. 다른 폼값 받기
  String name = mr.getParameter("name");
  String title = mr.getParameter("title");
  // 8.
  String[] cateArray = mr.getParameterValues("cate");
  StringBuffer cateBuf = new StringBuffer();
  if (cateArray == null) {
    cateBuf.append("선택 없음");
  } else {
    for (String s: cateArray) {
      cateBuf.append(s+",");
    }
  }
	
  // 9. DTO 생성
  MyfileDTO dto = new MyfileDTO();
  dto.setName(name);
  dto.setTitle(title);
  dto.setCate(cateBuf.toString());
  dto.setOfile(fileName);
  dto.setSfile(newFileName);
	
  // 10. DAO를 통해 데이터베이스에 반영
  MyfileDAO dao = new MyfileDAO();
  dao.insertFile(dto);
  dao.close();
	
  // 11. 파일 목록 JSP로 리다이렉션
  response.sendRedirect("FileList.jsp");
// 12.
} catch (Exception e) {
  e.printStackTrace();
  request.setAttribute("errorMessage", "파일 업로드 오류");
  request.getRequestDispatcher("FileUploadMain.jsp").forward(request, response);
}
%>
  1. application 내장 객체의 getRealPath() 메서드를 통해 Uploads 폴더의 물리적 경로를 얻어옴
  2. 1에서 준비한 값들로 MultipartRequest 객체 생성: 객체 생성 시 파일 업로드 완료(파일은 원본파일명 그대로 저장됨)
  3. MultipartRequset 클래스에서 서버에 저장된 파일명을 얻어온 후 확장자 분리
  4. 현재 날짜와 시간을 구한 후 확장자와 결합하여 새로운 파일명 생성
  5. 이미 저장된 파일명과 새롭게 생성한 파일명으로 File 객체 생성 (File.separator는 경로를 구분하는 특수 기호를 뜻하며, 환경에 상관없이 코드가 동작하게 하기 위함)
  6. 이미 저장된 파일명과 새롭게 생성한 파일명으로 File 객체 생성
  7. 파일 이외의 나머지 폼값을 MultipartRequset 객체의 getParameter() 메서드로 받음
  8. 카테고리는 필수가 아니므로 체크한 값이 없으면 “선택 없음”을 저장하고 선택했다면 쉼표(,)로 구분된 하나의 문자열로 만들어 저장
  9. DTO 객체를 생성하여 전송된 폼값 담기
  10. DAO 객체를 생성하고, 앞서 만든 insertFile() 메서드를 호출하여 데이터베이스에 데이터 저장
  11. 10에서 데이터 저장에 성공했다면 FileList.jsp로 이동
  12. 업로드에 실패하여 예외가 발생하면 request 영역에 메시지를 저장한 후, FileUploadMain.jsp로 포워드

5) 동작 확인

(1) FileUploadMain.jsp 실행

(2) 제목’과 ‘카테고리’를 입력하고 [파일 선택] 버튼을 눌러 업로드 할 파일을 선택

  • 파일 용량이 1MB 이하인지 확인하고, 파일명은 한글로 수정한 후 테스트 

(3) [전송하기] 버튼 클릭 (아직 FileList.jsp를 만들지 않았으므로 404 에러 발생)

(4) 동작 확인 

  • JDBConnect.java에서부터 Oracle DB에 연결이 안되는 문제: 명령 프롬프트(cmd)에서 lsnrctl start를 입력하여 해결
java.sql.SQLRecoverableException: IO 오류: The Network Adapter could not establish the connection
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536) 
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228) 
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) 
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677) 
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228) 
at common.JDBConnect.<init>(JDBConnect.java:28) 
at org.apache.jsp.ConnectionTest_jsp._jspService(ConnectionTest_jsp.java:127) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:64) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:446) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:356) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:307) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:656) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1792) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) 
at java.base/java.lang.Thread.run(Thread.java:834) 

Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection 
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:375) 
at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:422) 
at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:678) 
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:238) 
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1054) 
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:308) ... 36 more 

Caused by: java.net.ConnectException: Connection refused: connect 
at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method) 
at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) 
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412) 
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255) 
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.base/java.net.Socket.connect(Socket.java:608) 
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:209)
at oracle.net.nt.ConnOption.connect(ConnOption.java:123) 
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:353) ... 41 more JDBC 자원 해제

  • DB 커넥션 풀 설정 후 서버가 동작이 안되는 문제: context.xml 파일의 <ResourceLink global="dbcp_myoracle" name="dbcp_myoracle"
    type="javax.sql.DataSource" />에서 name 부분을 빼먹고 작성하여 발생함
  • INSERT 중 예외 발생 java.sql.SQLException: 부적합한 열 인덱스
    -> getCate()를 두 번 작성하여 입력값이 5개가 아닌 6개가 되어 발생.. 

 

  • 여전히 INSERT 중 예외 발생 java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement
    at fileupload.MyfileDAO.insertFile(MyfileDAO.java:22

    -> 잘못된 SQL 문법 - MyfileDAO.java에서 INSERT INTO를 INSER INTO로 오타내어 발생 

  • 이클립스에서 Uploads 폴더에 파일이 저장되어 있는지 확인 
    -> 이클립스의 폴더에는 아무것도 없으며,
        직접 윈도우 탐색기에서 [이클립스 워크스페이스 위치]에서 
        eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\HelloJSP\Uploads
        이동해야 확인 가능

  • 용량이 1MB를 초과하는 파일 업로드 시 FileUploadMain.jsp로 포워드됨(주소표시줄에는 UploadProcess.jsp가 표시되지만 FileUploadMain.jsp의 내용이 표시되며 "파일 업로드 오류" 메시지가 보임)
    • 이클립스 콘솔에도 에러가 찍힘! 

  • 명령 프롬프트(cmd)의 sqlplus에서 select * from myfile을 실행하여 데이터가 DB에 입력되었는지 확인
    -> 업로드 처리 성공!

반응형