attach 테이블로 따로 이미지 관리
jsp
form태그
action="/경로"
method ="post"
enctype="multipart/form-data"
input태그
type="file"
name"vo랑 같게 작성"
multiple (선택) ⇒ 여러 이미지 첨부 할 때 사용
submit ⇒ 제출
vo
MultipartFile ⇒ 파일 한개만 저장
MultipartFile [ ] ⇒ 파일 여러개 저장
package kr.or.ddit.vo;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@Data
public class LprodVO {
private int lprodId;
private String lprodGu;
private String lprodNm;
private MultipartFile lprodfile; //파일 한개만 저장
private MultipartFile[] lprodfiles; //파일 여러개 저장
}
service
파일 한 개 인 경우
@Autowired String uploadFolder; //파일 업로드경로
root-context.xml에 있는 uploadFolder 객체 불러옴
File 객체 ⇒ 파일 복사 위치
- 매개변수로 파일이나 디렉토리(폴더)의 경로를 보내 객체 생성
new File(복사_파일경로,파일이름);
File uploadPath = new File(this.uploadFolder,getFolder());
if(uploadPath.exists() == false) {
uploadPath.mkdirs();//파일생성
}
파일명 | getOriginalFilename() |
파일크기 | getSize() |
파일타입 | getContentType() |
log.info("파일명"+uploadFile.getOriginalFilename());
log.info("파일크기:"+uploadFile.getSize());
log.info("MiME:"+ uploadFile.getContentType());
복사 설계&실행
복사 설계
File saveFile = new File(uploadPath,uploadFileName);
복사 실행
uploadFile.transferTo(saveFile);
원본
ServiceImpl.java
package kr.or.ddit.service.impl;
import java.io.File;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import kr.or.ddit.dao.LprodDao;
import kr.or.ddit.service.LprodService;
import kr.or.ddit.utills.UploadController;
import kr.or.ddit.vo.LprodVO;
@Service
public class LprodServiceImpl implements LprodService {
@Autowired
LprodDao lprodDao;
@Autowired
UploadController uploadController; //연월일
@Autowired
String uploadFolder; //파일 업로드
@Override
public int createAjax(LprodVO lprodVO) {
int result = this.lprodDao.createAjax(lprodVO);
MultipartFile lprodfile = lprodVO.getLprodfile();
result+= this.uploadController.uploadOne(lprodfile, lprodVO.getLprodGu());
return result;
}
}
UploadController.java
package kr.or.ddit.utills;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import kr.or.ddit.dao.AttachDao;
import kr.or.ddit.vo.AttachVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class UploadController {
@Autowired
String uploadFolder;
@Autowired
AttachDao attachDao;
public String getFolder() {
//간단한 날짜 형식
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//날짜 객체 생성(java.util 패키지)
Date date = new Date();
String str = sdf.format(date);
//2024-01-30 -> 2024\\01\\30
//File.separator => \\ 윈도우 경로
// return str.replace("-", "\\"); 아래 코드랑 같은 의미
return str.replace("-", File.separator);
}
public int uploadOne(MultipartFile uploadFile, String globalCode) {
int result = 0;
File uploadPath = new File(this.uploadFolder,getFolder());
if(uploadPath.exists() == false) {
uploadPath.mkdirs();//파잀
}
log.info("----------------------------");
log.info("파일명"+uploadFile.getOriginalFilename());
log.info("파일크기:"+uploadFile.getSize());
log.info("MiME:"+ uploadFile.getContentType());
String uploadFileName = uploadFile.getOriginalFilename();
//중복 방지 위한 랜던 값 만들기
UUID uuid = UUID.randomUUID();
uploadFileName = uuid.toString()+"_"+uploadFileName;
//복사 설계
File saveFile = new File(uploadPath,uploadFileName);
try {
uploadFile.transferTo(saveFile);
//웹경로
String fileName = "/"+getFolder().replace("\\", "/")+"/"+uploadFileName;
AttachVO attachVO = new AttachVO();
attachVO.setGlobalCode(globalCode);
attachVO.setSeq(1);
attachVO.setFilename(fileName);
attachVO.setFileSize(uploadFile.getSize());
attachVO.setContentType(uploadFile.getContentType());
attachVO.setRegDate(null); //쿼리문 기본값 sysdate 있음
log.info("upload attachVO"+attachVO);
result += attachDao.insertAttach(attachVO);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return result;
}
}
파일 여러개인 경우
스프링 파일객체 타입의 배열로부터 파일 객체를 하나씩 꺼내보기
MultipartFile[] lprodfiles =lprodVO.getLprodfiles();
//변수 선언//
String uploadFileName =""; //업로드용
String fileName=""; // DB용
int seq = 1;
//for문 이용해서 attach 값 넣기
for(MultipartFile multipartFile:lprodfiles) {
log.info("-------------------------");
log.info("파일명:"+multipartFile.getOriginalFilename());
log.info("파일크기 : "+multipartFile.getSize());
log.info("MIME"+multipartFile.getContentType());
log.info("-------------------------");
uploadFileName = multipartFile.getOriginalFilename();
//UUID
UUID uuid = UUID.randomUUID();
uploadFileName = uuid.toString()+"_"+uploadFileName;
//파일 복사 계획
//File 객체 설계(복사할 대상 경로 , 파일명)
File saveFile = new File(uploadPath,uploadFileName);
//파일 복사 실행
try {
multipartFile.transferTo(saveFile);
//2024\\05\\07 (윈도우경로) 그래서 웹경로(/)로 대체
fileName="/"+getFolder().replace("\\", "/")+"/"+uploadFileName;
AttachVO attachVO = new AttachVO();
attachVO.setGlobalCode(lprodVO.getLprodGu()); //기본키 등록
attachVO.setSeq(seq++);//복합키
attachVO.setFilename(fileName);
attachVO.setFileSize(multipartFile.getSize());
attachVO.setContentType(multipartFile.getContentType());
attachVO.setRegDate(null);
log.info("attachVO"+attachVO);
result +=this.attachDao.insertAttach(attachVO);
} catch (IllegalStateException e) {
log.error(e.getMessage());
} catch (IOException e) {
log.error(e.getMessage());
}
}
원본
UploadController.java
package kr.or.ddit.utils;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.dao.AttachDao;
import kr.or.ddit.vo.AttachVO;
import kr.or.ddit.vo.ContUsVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class UploadController {
@Autowired
String uploadFolder; //root-context.xml 랑 같음 static 쓰는 이유 => uploadOne 쓰기 위해서
@Autowired
AttachDao attachDao;
@Autowired
String uploadFolderDirect;
//연/월/일 폴더 생성
public String getFolder() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String str = sdf.format(date);
//File.separator => \\ 윈도우 경로
// return str.replace("-", "\\"); 아래 코드랑 같은 의미
return str.replace("-", File.separator);
}
public int uploadMulti(MultipartFile[] upload,String globalCode) {
int result = 0;
File uploadPath = new File(uploadFolder,getFolder());
if(uploadPath.exists()==false){
uploadPath.mkdirs();
}
//스프링파일객체 타입의 배열로 부터 파일 객체를 하나씩 꺼냄
String uploadFileName =""; //업로드용
String fileName=""; // DB용
int seq = 1;
for(MultipartFile multipartFile:upload) {
log.info("-----------------");
log.info("파일명:"+ multipartFile.getOriginalFilename());
log.info("파일크기:"+ multipartFile.getSize());
log.info("MIME: "+ multipartFile.getContentType());
uploadFileName = multipartFile.getOriginalFilename();
//UUID : 랜덤값 생성
UUID uuid = UUID.randomUUID();
//asdfasdf개똥이.jsp
uploadFileName = uuid.toString()+"_"+ uploadFileName;
//복사 설계
File saveFile = new File(uploadPath,uploadFileName);
try {
multipartFile.transferTo(saveFile);
//웹경로
fileName = "/"+getFolder().replace("\\", "/") + "/"+uploadFileName;
AttachVO attachVO = new AttachVO();
attachVO.setGlobalCode(globalCode);
attachVO.setSeq(seq++);
attachVO.setFilename(fileName);
attachVO.setFileSize(multipartFile.getSize());
attachVO.setContentType(multipartFile.getContentType());
attachVO.setRegDate(null);
log.info("upload attachVO"+ attachVO);
result += attachDao.insertAttach(attachVO);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
'JAVA > spring' 카테고리의 다른 글
SQL.xml 에서 join쿼리 사용하는 경우 (resultMap) (0) | 2024.05.15 |
---|---|
페이징 처리 (0) | 2024.05.14 |
중첩된 자바빈 (0) | 2024.05.11 |
어노테이션 (0) | 2024.05.04 |
컨트롤러 메서드 매개변수 (0) | 2024.05.04 |