본문 바로가기
CLASS/SPRINGBOOT

#4-1 / Spring boot - 파일 업로드

by hingu 2024. 8. 19.

2가지 방식

1. @RequestParam 형태의 파일 업로드 기능 

2. @RequestPart 형태의 파일 업로드 기능

 

application.properties

#file I/O

#업로드 기능을 사용함
spring.servlet.multipart.enabled=true 

#파일 하나의 최대 사이즈
spring.servlet.multipart.max-file-size=4MB

#Multi 형태 - 여러개의 파일 업로드시 전체 합계 크기
spring.servlet.multipart.max-request-size=10MB

 

4MB 이상 파일 업로드시 이러케 에러가 뜬다..!

 

  👀 1. @RequestParam 형태의 파일 업로드 기능  

- fileupload.jsp

<body>
	<form method="post" id="frm" action="./fileuploadok.do" enctype="multipart/form-data">
		단일 파일 업로드 : <input type="file" name="file1"><br>
		<input type="button" value="전송" onclick="fileok()">
	</form>
</body>

<script>
	function fileok(){
		frm.submit();		
	}
</script>

 

- controller

@PostMapping("/fileuploadok.do")
public void fileupload(
        @RequestParam("file1") MultipartFile files, 
        ServletResponse res, ServletRequest req) throws IOException{
    res.setContentType("text/html;charset=utf-8");

    this.pw = res.getWriter();

    String filenm = files.getOriginalFilename();
    long filesize = files.getSize();

    String url = req.getServletContext().getRealPath("/upload/"); 

    //-- 확장자명 추출
    String nm = filenm.substring(filenm.lastIndexOf("."));

    //-- 파일 업로드시 중복이름 피하기 위한 랜덤 이름 생성
    String newname = UUID.randomUUID().toString(); //ver4
    System.out.println(newname); //004159f6-bd83-443f-9e23-d1a106cff0ab 우왕

    //-- file 저장
    String copys = url + newname + nm;
    FileCopyUtils.copy(files.getBytes(), new File(copys));

    this.pw.print("<script>"
            + "alert('파일 업로드가 완료되었습니다.');"
            + "</script>");
}

- HttpServletResponse res : apache용 => ServletResponse res : 상위모델 / Jakarta용 / 부트 형태에서 더 빠름

- UUID

  : 암호와 알고리즘 , 디코딩은 없음

    version 1 (PC - Macaddress를 사용하는 형태) , 

    version 3 (MD5 hash) , version 4 (Random 함수) , version5 (SHA-1 함수)

 

try {
    //md = MessageDigest.getInstance("MD5"); //ver 3:md5형태
    MessageDigest md = MessageDigest.getInstance("SHA-1"); //ver5:sha-1형태
    byte[] by = md.digest();
    String newname = UUID.nameUUIDFromBytes(by).toString();
    System.out.println(newname); //4f71fcca-c43c-3354-9ddd-9cd772f37598
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

 

❗ version3 or version 5 사용하는 방식

 

 

req.getServletContext().getRealPath("/upload/")

=> D:\springboot\bootweb\src\main\webapp\upload\ 짧아졋당 => 여기에 랜덤 이름으로 이미지 올라감

 

 

  👀 2. @RequestPart 형태의 파일 업로드 기능  

- jsp동일  form action만 바뀜  

 

- controller

@PostMapping("/fileuploadok2.do")
public void fileupload2(
        @RequestPart(value="file1", required = false) MultipartFile files,
        ServletResponse res) throws Exception {
    System.out.println(files.getOriginalFilename());

    //나머진 @RequestParam 얘랑 동일한 방식
}

 

  👀 3. 파일 업로드 기능  - multipart

-> RequestParam, RequestPart 둘다 가능 

 

- jsp에 multiple file 추가  

<body>
	<form method="post" id="frm" action="./fileuploadok2.do" enctype="multipart/form-data">
		단일 파일 업로드 : <input type="file" name="file1"><br><br>
		복합 파일 업로드 : <input type="file" name="file2" multiple="multiple"><br><br>
		<input type="button" value="전송" onclick="fileok()">
	</form>
</body>

<script>
	function fileok(){
		frm.submit();		
	}
</script>

 

 

- Controller

	@PostMapping("/fileuploadok3.do")
//	public void fileupload3(@RequestPart("file2") MultipartFile files[]) {
//	public void fileupload3(@RequestParam("file2") MultipartFile files[]) {
	public void fileupload3(@RequestParam("file2") List<MultipartFile> files) {
		for(MultipartFile fi : files) { //List<MultipartFile> 요거로 받는 경우
			System.out.println(fi.getSize()); //사이즈 각각 확인 가능
		}
	}