1. maven repository 에서 검색 후 라이브러리 설치 2. pom.xml 에 업로드
3. commons-fileupload 쓰는 이유 -> @Muticonfig 로 server 에 업로드 하면 CDN서버(이미지 전용 서버)를 못 씀 ∴ 그래서 commons-fileupload 이 나옴 => CDN ,localserver 다 사용 가능
1-2. webpage.xml 세팅 (servlet-context.xml)
1. 파일 업로드를 사용할 수 있도록 class 를XML로 로드 -> ctrl + h 로 CommonsMultipartResolver 검색 후 패키지 가져와서 property class 로 넣기 🚨 속성 값을 정해주기 : 인코딩, 파일 용량, 업로드 메모리 etc.. ⑴ id : multipartResolver (필수로 해당 아이디를 적용) ⑵ maxInMemorySize 값이 너무 커서 수업 도중 계속 오류발생 -> maxInMemorySize 값을 200000d으로 수정함 ⑶ maxUploadSize : 최대 업로드 파일 크기 ( -1 : 업로드 용량 제한 없음) ⑷ maxInMemorySize : Tomcat에서 사용되는 메모리와 대칭이 되며 server.xml에 메모리 max에 할당되는 size만큼 적용할 수 있음 => 서버에서 할당되는 만큼 만 사용할 수 있음 (쓸수록 속도가 향상됨) 잘 못 쓰면 메모리 과부하로 서버 shutdown
2. I/O 활용
2-1. 한개의 파일 업로드, 웹 디렉토리에 저장
1. form 전송 시 enctype="multipart/form-data" 꼭 쓰기 2. I/O(파일 전송)쓸 때 예외처리 안하면 에러남 3. file i/o 문법 ⑴ RequestParam ("form 에 사용한 name명") ⑵ realpath 를 가져오려면 HttpServletRequest가 필수적임 ⑶ 저장될 경로는 웹 경로 + 파일 명 ⑷ MultipartFile 자료형 : @RequestParam 사용시 form 에 대한 Name 만 적용, Required 적용 안됨, 첨부 안했을 때 (null일때) 알아서 거름
@Controller
public class shop_main2 {
@PostMapping("/fileupok.do")
public void fileupok(@RequestParam("mfile") MultipartFile files,
HttpServletRequest req) throws Exception{
String filenm = files.getOriginalFilename(); //파일명
long filesize = files.getSize(); //파일 사이즈 (int 는 너무 작아서 long 으로 써줌)
String filetype = files.getContentType(); //파일 속성
String url = req.getServletContext().getRealPath("/upload/")+filenm; //저장될 경로
System.out.println(url); //syso 로 띄워서 실제 경로에 upload 폴더 생성해놓기
if(filesize>2097152) {//2MB
System.out.println("첨부파일 용량은 2MB이하 입니다.");
}else {
File fe = new File(url+filenm);
byte by[] = files.getBytes();
FileCopyUtils.copy(by, fe);
//FileCopyUtils.copy(files.getBytes(), new File(url)); -> 한줄로 줄여쓰기
}
}
1. 동일한 첨부파일 name 일 경우 원시배열로 값을 이관받음 2. Front 에서 multiple을 구현하더라도 동일하게 원시배열로 이관 받을 수 있음
@Controller
public class shop_main2 {
@PostMapping("/fileupok2.do")
public void fileupok2(@RequestParam("mfile") MultipartFile files[],
HttpServletRequest req)throws Exception {
//Front 쪽에서 동일한 name을 사용한 갯수 (첨부한 파일수와 관계 없이)
int file_ea = files.length;
//name 값이 다 다를 경우
//@RequestParam("mfile1")MultipartFile files1
//@RequestParam("mfile2") MultipartFile files2
//@RequestParam("mfile3")MultipartFile files3 형태로 받아야함
}
}