[SPRING] :: MULTIPARTFILE

[SPRING] :: MULTIPARTFILE

MULTIPARTFILE :: 파일 업로드 시, 파일 정보등을 제어하는 클래스 메소드 메소드 설명 String getName() 업로드한 파일의 명칭을 가져오는 메소드 Boolean isEmpty() 파일 업로드 여부를 체크하는 메소드 String getOriginalFilename() 업로드한 파일의 실제 명칭을 가져오는 메소드 void transferTo(File dest) 파라미터 파일 경로에 업로드한 파일을 저장 ​ [예시] :: FILE UPLOAD # 1 POM.XML 라이브러리 추가 :: COMMONS-IO / COMMONS-FILEUPLOAD 를 POM.XML 에 추가한다.

​# 2 TABLE 준비 TYPE PHOTO TABLE CREATE TABLE PHOTO(

IDX NUMBER(3,0) PRIMARY KEY,

TITLE VARCHAR2(100),

FILENAME VARCHAR2(100),

PWD VARCHAR2(50),

IP VARCHAR2(50),

REGIDATE DATE

);

# 3 PHOTOVO.JAVA 생성 :: PHOTO 변수가 파일 정보 자체가 된다. :: 실제 파일은 서버의 경로에 저장된다.

package vo; import org.springframework.web.multipart.MultipartFile; public class PhotoVO { /* TITLE은 사진의 제목을, PHOTO는 사진의 정보를 담는다. 업로드시에는 컬럼명과 데이터를 받는 INPUT태그의 NAME과 VO명칭은 동일하게 해야한다. */ private String title; // 제목: private MultipartFile photo;// 사진: /* FILENAME은 명칭을 저장할 변수를 뜻한다. (명칭은 임의대로 작성하면 된다.) 파일이나 이미지는 실제로 서버에 저장되는 것이 아닌 로컬의 경로에 저장이 파일의 명칭이 서버에 저장되는데 업로드된 파일의 명칭을 검색하여 해당 파일이나 이미지를 불러오는 방식으로 사용하게 된다. */ private String filename; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public MultipartFile getPhoto() { return photo; } public void setPhoto(MultipartFile photo) { this.photo = photo; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }

# 4 CONTEXT-4-FILEUPLOAD.XML 추가 ​:: FILEUPLOAD를 위한 빈 객체 생성

​# 5 SERVLET-CONTEXT.XML

# 6 INSERT_FORM. JSP

:: 파일 업로드 FORM태그의 속성은 POST, ENCTYPE이 타입이 있어야한다.

# ENCTYPE

- DEFAULT : 서버로 전송 시 모든 문자 인코딩

- TEXT/PLAIN : 공백문자 (SPACE) 를 + 로 변환하는 인코딩

- MULTIPART/FORM-DATA : 서버로 전송 시 모든 문자열을 인코딩 하지 않음

(파일이나 이미지 전송 시 사용하며 이 경우 반드시 POST타입이여야한다.)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here function send(f) { var title = f.title.value; var photo = f.photo.value; if(title==''){ alert("제목을 입력하세요."); return; } if(photo==''){ alert("파일 사진을 선택하세요."); return; } // VO를 먼저 거치게된다. f.action = "upload.do"; f.submit(); } 제목: 사진:

# 7 INPUT_RESULT.JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here ${ vo.title } ​# 8 FILEUPLOADCONTROLLER.JAVA :: 파일 업로드 처리 과정에서는 보통 두가지 작업이 진행된다. :: 업로드 파일의 정보를 등록하는 것과 파일의 명칭에대한 넘버링 작업이 해당된다.

package com.korea.fileupload; import java.io.File; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import vo.PhotoVO; @Controller public class FileuploadController { /* AUTOWIRED 파라미터로 객체를 받을 필요없이 NEW가 없어도 자동으로 객체생성이 되는 어노테이션 자동 객체 생성을 하면 맵핑시에 메소드안에서 따로 파라미터를 받아줄 필요없이 객체를 재활용하는 것이 가능해진다. */ @Autowired ServletContext application; @Autowired HttpServletRequest request; @Autowired HttpSession session; // JSP를 동작할 경로 지정 public static final String VIEW_PATH = "/WEB-INF/views/"; // 파일 입력 폼으로 화면 전환 @RequestMapping(value= {"/","/insert_form.do"}) public String insert_form() { return VIEW_PATH + "insert_form.jsp"; } // 파일 업로드 @RequestMapping("/upload.do") public String upload(PhotoVO vo) throws IllegalStateException, IOException { // GETREALPATH를 통한 업로드할 로컬상의 절대 경로 파악 String webPath = "/resources/upload/"; String savePath = application.getRealPath(webPath); System.out.println(savePath); // MULTIPARTFILE 객체 생성 // GETPHOTO를 통해서 업로드된 파일의 정보를 담는다. MultipartFile photo = vo.getPhoto(); String filename = "no_file"; // 파일 정보 여부 파악 (없다면 NULL일 것이다.) // PHOTO객체가 비어있지않다면 FILENAME에 실제 파일명을 가져올 수 있다. if(!photo.isEmpty()) { // FILENAME에 실제 파일명의 이름을 등록한다. filename = photo.getOriginalFilename(); // SAVEPATH에 FILENAME의 파일이 있는지 파악 File saveFile = new File(savePath, filename); // SAVEFILE에 파일 경로가 없는 경우 (첫 저장) if(!saveFile.exists()) { // MKDIRS를 통해서 FILENAME에 해당하는 폴더를 생성 saveFile.mkdirs(); // 경로에 동일한 파일이 저장된 상태 }else { /* 동일한 파일명을 처리하는 방법 - SYSTEM.CURRENTTIMEMILLES를 통해서 TIME변수에 현재 시간의 정보를 저장한다. - FILENAME을 파일명_시간으로 변경 - 변경된 FILENAME으로 경로를 다시 생성 */ long time = System.currentTimeMillis(); filename = String.format("%d_%s", time,filename); saveFile = new File(savePath,filename); } /* MKDIRS로 이미 중복되지 않는 경로에 폴더를 생성한 상태 TRANSFERTO 메소드를 사용하여 생성한 경로에 PHOTO안에 있는 파일을 복사한 뒤 SAVEFILE경로로 붙여넣기한다. (TRANSFERTO는 파일이나 주소가 없는 예외가 있을 수 있으므로 TRY-CATCH 혹은 THROW처리한다.) */ photo.transferTo(saveFile); } // 파일의 저장이 완료되었으니 FILENAME의 값을 VO에 저장한다. (실제에서는 DB에 저장할 것이다.) vo.setFilename(filename); // BINDING request.setAttribute("vo", vo); // FORWARDING return VIEW_PATH + "input_result.jsp"; } }

[참고] :: TRANSFERTO 사용 이유 :: 파일 업로드 시, 업로드된 파일은 바로 경로에 저장되지 않고 MULTIPARTRESOLVER 클래스가 지정한 임시저장소에 저장된다. :: FILE 클래스는 명칭에 파일 확장자가 포함되더라도 확장자 명칭이 포함된 파일 경로를 잡아야한다고 착각하게 된다. :: 이를(컴파일러가 임시저장소에 있는 확장자가 포함된 폴더를 생성하는 것) 방지하기위해서 미리 MKDIRS로 폴더를 생성한다. :: 그리고 TRANSFERTO를 사용하여 폴더를 파일로 덮어쓰기한다. ​[예시] :: 중복 이미지 저장 시 처리

from http://hikr90.tistory.com/152 by ccl(A) rewrite - 2022-01-01 00:27:45