JAVA/JSP 35. 파일 업로드 및 다운로드 - 라이브러리 추가하기, 파일 업로드
*이 글을 쓰는 시점부터는 노트북이 고장나는 바람에.. 다른 분의 글과 이전에 올렸던 글들을 참고하여, 다른 데스크탑의 윈도우 환경에 환경설정을 다시 진행한 후 작성하였습니다. 환경설정 관련 글들은 아래를 참고해 주세요.
- 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 라이브러리 추가 필요
- http://servlets.com/cos/ 배포 사이트에 접속 후 아래로 스크롤하여 다운로드 링크 클릭
- 다운로드한 파일의 압축 풀고 cos.jar 파일 찾기
- 이클립스의 {프로젝트 루트}/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>
- 작성폼의 입력값을 검증하기 위한 자바스크립트 함수: 작성자 이름/제목/첨부파일이 입력되었는지 확인하고, 입력되지 않았다면 경고창을 띄우고 해당 입력란으로 포커스 이동 후 전송 취소를 위해 false 반환
- method는 post로, enctype은 multipart/form-data로 설정한 후 입력값 검증을 위해 onsubmit 이벤트 핸들러에서 1의 함수를 호출
- 작성자와 제목을 입력하기 위한 input 상자(필수 입력 사항)
- 카테고리를 선택하기 위한 input 상자: type을 체크박스로 지정하여 여러 개 값을 동시에 전송할 수 있으며, 선택사항이므로 폼값을 검증하지 않음
- 첨부파일 선택을 위한 input 상자: type을 file로 지정하여 버튼을 누르면 파일 선택이 가능한 창을 띄워줌
- 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;
}
}
- 커넥션 풀 사용을 위해 DBConnPool을 상속
- 새로운 게시물을 입력하기 위한 메서드: 매개변수로 DTO 객체를 받으며, 작성폼을 통해 전송된 값을 DTO에 저장한 후 insertFile() 메서드의 인수로 전달됨
- INSERT 쿼리문 실행 후 적용된 행의 개수를 저장하기 위한 변수 생성(변수의 값은 7에서 할당됨)
- INSERT 쿼리문을 작성: 시퀀스는 seq_board_num을 사용
- PreparedStatement 객체를 생성
- ?로 지정된 인파라미터 설정(DTO 객체의 Getter 메서드 사용)
- 쿼리문 실행 시 적용된 행의 개수가 정수로 반환(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);
}
%>
- application 내장 객체의 getRealPath() 메서드를 통해 Uploads 폴더의 물리적 경로를 얻어옴
- 1에서 준비한 값들로 MultipartRequest 객체 생성: 객체 생성 시 파일 업로드 완료(파일은 원본파일명 그대로 저장됨)
- MultipartRequset 클래스에서 서버에 저장된 파일명을 얻어온 후 확장자 분리
- 현재 날짜와 시간을 구한 후 확장자와 결합하여 새로운 파일명 생성
- 이미 저장된 파일명과 새롭게 생성한 파일명으로 File 객체 생성 (File.separator는 경로를 구분하는 특수 기호를 뜻하며, 환경에 상관없이 코드가 동작하게 하기 위함)
- 이미 저장된 파일명과 새롭게 생성한 파일명으로 File 객체 생성
- 파일 이외의 나머지 폼값을 MultipartRequset 객체의 getParameter() 메서드로 받음
- 카테고리는 필수가 아니므로 체크한 값이 없으면 “선택 없음”을 저장하고 선택했다면 쉼표(,)로 구분된 하나의 문자열로 만들어 저장
- DTO 객체를 생성하여 전송된 폼값 담기
- DAO 객체를 생성하고, 앞서 만든 insertFile() 메서드를 호출하여 데이터베이스에 데이터 저장
- 10에서 데이터 저장에 성공했다면 FileList.jsp로 이동
- 업로드에 실패하여 예외가 발생하면 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에 입력되었는지 확인
-> 업로드 처리 성공!