요르딩딩

[Personal_Project] 파일업로드 (단일/다중) (8) 본문

[Personal_Project]

[Personal_Project] 파일업로드 (단일/다중) (8)

요르딩딩 2021. 5. 12. 17:23
728x90
반응형

이번시간에는 파일을 업로드하는 방법을 적용해 보겠습니다.

단일 파일, 다중 파일을 각각 업로드 할 수 있도록 하겠습니다.

 

파일 업로드를 위해서 multipartResolver 인터페이스와 CommonMultipartResolver 구현체를 사용하겠습니다.

 

1. 파일 업로드를 위해  pom.xml에 아래와 같이 추가하여줍니다.

[pom.xml]

<!-- fileupload --> 
   <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
   </dependency>
		

 

2. 파일 업로드로 들어오는 데이터를 처리하기 위한 객체인 MultipartResolver 클래스를 Bean으로 등록하여 줍니다.

[dispatcher-servlet.xml]

<!-- 파일을 처리하기 위한 MultipartResolver 클래스를 bean으로 등록 -->
<!-- multipartResolver 인터페이스와 CommonsMultipartResolver 구현체 -->
<!-- 파일 업로드로 들어오는 데이터를 처리하는 객체 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

 

3. 화면을 출력해줄 jsp파일을 작성하여 줍니다.

- 단일/다중 파일 업로드 form을 각각 작성하였습니다.

- form태그의 action속성은 실행할 controller의 메소드명과 일치시켜주어야합니다.

- 다중 파일업로드의 경우는 input태그에 multiple속성을 추가해 주어야합니다.

 

[fileUpload.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<h1>File Upload (파일 업로드)</h1>
<!-- action의 값이 endpoint를 바라봅니다., enctype은 멀티파트 옵션을 줌 -->
<!-- form 태그의 enctype 속성은 multipart/form-data로 세팅하여 브라우져가 파일 업로드 방식으로 동작하도록 설정 -->
<form action="fileUpload"  method="post" enctype="multipart/form-data">
	<!-- input 태그 file 속성으로 작성하여 form 방식으로 파일 업로드를 할 수 있습니다.-->
	<input type="file"  name="uploadfile" placeholder="파일 선택" /><br /> 
	<input type="submit" value="upload">
</form>

<h1>Multi File Upload (다중 파일 업로드)</h1>
<form action="multi_fileUpload"  method="post" enctype="multipart/form-data">
	<!-- multiple 속성추가 -->
    <input type="file" name="uploadfiles" placeholder="파일 선택" multiple/><br/>
    <input type="submit" value="upload">
</form>
</html>

 

4. Controller를 작성해 줍니다. 

- 파일 업로드 화면(View)을 출력해줄 "fileUpload_jsp"

- 단일 파일 업로드를 해줄 "fileUpload"

- 다중 파일 업로드를 해줄 "multi_fileUpload"

 

- getOriginalFilename() :파일 이름을 String 값으로 반환한다.

- getSize() : 파일의 크기를 반환한다.

- jsp파일의 method속성을 post로 작성하였으므로, PostMapping으로 적어주어야 합니다.

 

[commonController.java]

    /*
	 * 파일업로드 jsp
	 */
	@RequestMapping(value = "fileUpload_jsp") //jsp파일명이랑 이름이 같아야한다.
	public String fileUploadJsp(MultipartFile uploadfile, Model model) throws Exception {
		
		System.out.println("fileUpload_jsp");
		
		return"fileUpload";
	}
	/*
	 * 8-1.파일업로드 서비스
	 */
	@PostMapping(value = "fileUpload") //jsp파일명이랑 이름이 같아야한다.
	public String fileUpload(MultipartFile uploadfile, Model model) throws Exception {
		//파일을 받을 수 있게끔 MultipartFile을 매개변수 선언
		
		System.out.println("upload() POST 호출");
		//파일 이름을 String 값으로 반환한다
		System.out.println("파일 이름(uploadfile.getOriginalFilename()) : "+ uploadfile.getOriginalFilename());
		//파일 크기를 반환한다
		System.out.println("파일 크기(uploadfile.getSize()) : "+ uploadfile.getSize());
		
		fileuploadService.saveFile(uploadfile);
		
		return "fileUpload";
	}
	
	/*
	 * 8-2. 다중 파일업로드 서비스
	 */
	@PostMapping(value = "multi_fileUpload") //jsp파일명이랑 이름이 같아야한다.
	public String multiFileUpload(MultipartFile[] uploadfiles, Model model) throws Exception {
		//파일을 받을 수 있게끔 MultipartFile 배열을 매개변수 선언

		for(MultipartFile f: uploadfiles) {
			System.out.println("upload() POST 호출");
			//파일 이름을 String 값으로 반환한다
			System.out.println("파일 이름(uploadfile.getOriginalFilename()) : "+ f.getOriginalFilename());
			//파일 크기를 반환한다
			System.out.println("파일 크기(uploadfile.getSize()) : "+ f.getSize());
			
			fileuploadService.saveFile(f);
		}
		
		return "fileUpload";
	}

 

4. FileUploadService 인터페이스 작성

[FileUploadService.java]

import org.springframework.web.multipart.MultipartFile;

public interface FileUploadService {
	public String saveFile(MultipartFile file);
}

 

5. FileUploadServiceImpl 작성

- 17,18줄 : 저장 할 폴더 경로에 파일이름이 중복되지 않게 uuid를 파일명 앞에 붙여주므로써 고유한 파일명을 가지도록 합니다.

- 23줄 : 저장될 경로와 파일이름을 가진 File객체를 생성

- 26줄 : 업로드될 파일(MultipartFile file)을 .transterTo() 메소드에 (경로,이름)File객체를 사용하여 파일을 저장합니다.

 

[FileUploadServiceImpl.java]

package com.service.serviceImpl;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.service.FileuploadService;

@Service("fileuploadService")
public class FileUploadServiceImpl implements FileuploadService {

	public String saveFile(MultipartFile file) {
		// 파일 이름 변경
		UUID uuid = UUID.randomUUID();
		String saveName = uuid + "_" + file.getOriginalFilename(); //서버상의 파일이름이 겹치는것을 방지

		System.out.println("saveName: " + saveName);

		// 저장할 File 객체를 생성(껍데기 파일)
		File fileInfo = new File("/Users/jang/Downloads", saveName); // 저장할 폴더 경로, 저장할 파일 이름

		try {
			file.transferTo(fileInfo); // 업로드 파일에 fileInfo이라는 정보를 추가하여 파일을 저장한다.
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}

		return saveName;
	} 
}

 

[전체화면]

 

[단일 파일업로드 화면]

 

[다중 파일업로드 화면]

 

728x90
반응형
Comments