폼에 enctype='multipart/form-data'가 추가
enctype이 폼에 추가가 되면 기본적으로 request에 값을 담을수 없다.
업로드된 파일저장
. 데이터베이스에는 저장시키지 않는다
. DB에는 업로드 된 파일명과 확장명, 파일크기정도만 저장을 시키고,
실제 파일은 웹서버의 하드디스크에 저장을 시킨다.
전송된 File 저장(jakarta FileUpload API, 파일 업로드)
파일 전송 원리
파일 ---> Web Browser ---> 전송 ---> Tomcat ---> 디스크에 저장 (파일)
---> DB에 저장(파일관련 속성)
. boolean isFormField(): 일반적인 입력 파라미터인 경우 true를 리턴 합니다.
. String getFieldName(): 파라미터의 이름을 구합니다.
. String getString() : 기본 캐릭터셋을 이용하여 파라미터의 값을 구합니다.
. String getString(String encoding): 지정한 인코딩을 이용하여 파라미터값을 구함
. String getName() : 업로한 파일의 전체 경로를 포함한 이름을 구합니다.
. long getSize() : 업로드한 파일의 크기를 구합니다.
. void write(File file): 업로드한 파일을 file이 나타내는 파일로 저장합니다.
. InputStream getInputStream(): 업로드한 파일을 읽어오는 입력 스트림을 리턴합니다.
. byte[] get() : 업로드한 파일을 byte 배열로 구합니다.
. boolean isInMemory() : 업로드한 파일이 임시 디렉토리에 저장된 상태인 경우
true를 리턴하고, 임시 데렉토리에 저장된 경우 false를 리턴합니다.
. void delete() : 파일과 관련된 자원을 제거합니다.메모리가 사용되고
있을 경우 메모리를 반환하고, 임시 디렉토리에 있는 파일을 삭제합니다.
참조: http://www.servlets.com
TOMCAT 10버전에서는 에러가 발생해서
TOMCAT 9버전을 설치해서 테스트 한다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>uploadtest</title>
</head>
<body>
<h3>파일 첨부 테스트</h3>
<form method="post" action="uploadtestProc.jsp">
이름: <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="전송"><br>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>uploadtestProc</title>
</head>
<body>
<h3> 파일 첨부 테스트 결과</h3>
<%
request.setCharacterEncoding("UTF-8");
out.print(request.getParameter("uname"));
out.print("<hr>");
out.print(request.getParameter("subject"));
out.print("<hr>");
out.print(request.getParameter("content"));
out.print("<hr>");
out.print(request.getParameter("filenm"));
out.print("<hr>");
%>
</body>
</html>
enctype="multipart/form-data"
문자열 정보와 파일도 동시에 전송
enctype="multipart/form-data"속성이 폼에 추가되면
request 내장 객체가 가지고 있는 값을 가져올 수 없다
request.getParameter("") null 출력
1.첨부된 파일 저장하기
// src/main/webapp/strage
*/
//실제 물리적인 경로
try{
String saveDirectory=application.getRealPath("/storage");
//out.print(saveDirectory);
// D:\202301\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\myweb\storage
//최대 저장 용량(10M)
int maxPostSize=1024*1024*10;
//한글 인코딩
String encoding="UTF-8";
MultipartRequest mr=new MultipartRequest(request,saveDirectory,maxPostSize,encoding,new DefaultFileRenamePolicy());
//2. mr참조변수가 가리키고 있는 텍스트
out.print("<hr>");
out.print(mr.getParameter("uname"));
out.print("<hr>");
out.print(mr.getParameter("subject"));
out.print("<hr>");
out.print(mr.getParameter("content"));
out.print("<hr>");
3. /storage폴더에 저장된 파일정보 확인하기
//1.mr에서 <input type=file> 전부 수거
//열거형 Enumeration enum={"KIM","LEE","PARK"}
//첨부파일이 3개 ->files={<input type=file>,<input type=file>,<input type=file>}
Enumeration files= mr.getFileNames();
//2. files가 가지고 있는 값들 중에서 개별적으로 접근하기 위해 name 가져오기
//첨부 :<input type=file name=filenm>
String item=(String)files.nextElement(); //filenm
//3. item이름 (filenm)이 가지고 있는 실제파일을 mr객체에서 가져오기
String ofileName=mr.getOriginalFileName(item);
out.print("원본 파일명:"+ ofileName);
out.print("<hr>");
String fileName=mr.getFilesystemName(item);
out.print("리네임 파일명: "+fileName);
out.print("<hr>");
//4. storage 폴더에 저장된 파일의 기타 정보 확인하기
File file =mr.getFile(item);
if(file.exists()){
out.print("원본 파일명:"+ file.getName());
out.print("<hr>");
out.print("원본 파일명:"+ file.length()+"byte");
out.print("<hr>");
}else{
out.print("파일 존재하지 않음");
}