상세 컨텐츠

본문 제목

[Java] 스프링(Spring) 파일업로드하기

자바(Java)

by 쏘문 rumor1993 2018. 11. 13. 15:19

본문

반응형

스프링을 통해서 파일을 업로드하고 다운로드 하는 부분에 대해서 공부해보려고 합니다.

우선은 두가지를 동시에 다루기에는 양이 많아 파일업로드와 파일다운로드를 분류해서 

진행하도록 하겠습니다.

스티커 이미지



파일업로드


1. pom.xml 라이브러리 추가

- 우선 pom.xml에 파일업로드에 필요한 라이브러리를 추가하셔야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 파일업로드 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.2</version>
        </dependency>
<!-- 파일업로드 -->
cs


파일업로드에 필요한 라이브러리를 다운받기 위해 pom.xml에 Dependency를 추가해주므로 자동적으로 파일업로드 라이브러리를  메이븐이 다운로드 받아줍니다.


2. servlet-context.xml 설정하기

- 파일업로드시 들어오는 데이터를 처리해주는 객체를 만들어줍니다.


1
2
3
4
5
6
7
8
9
10
11
<-- 들어오는 데이터를 처리해주는 multipartResolver 빈을 생성해주는 부분입니다 -->    
 
<beans:bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="31457280" /<!--약 10mb 제한 -->
        <beans:property name="defaultEncoding" value="utf-8" />    <!-- 인코딩 -->
    </beans:bean>

cs


3.  Contoller단 설정하기

- 파일을 view단에서 업로드를 하면 실질적으로 업로드에 대한 처리를 해주는부분입니다. 

 실제로 파일을 설정한 경로에 생성해주는 것을 처리하는 부분 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Controller
 
public class FileAction {
    private static final String SAVE_PATH = "파일을 저장할 경로를 적어주세요";
 
    
 
    @RequestMapping("upload")
    public ModelAndView upload(
            @RequestParam(value="file1", required = false) MultipartFile mf) {
            ModelAndView mv = new ModelAndView("uploadView")        
 
 
            String originalFileName = mf.getOriginalFilename();
            long fileSize = mf.getSize();
            String safeFile = SAVE_PATH + System.currentTimeMillis() + originalFileName;
 
            
            try {
                mf.transferTo(newFile(safeFile));
 
               } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        return mv
    }
cs


@RequestParam(value="file1", required = false) MultipartFile mf

@RequestParam을 통해서 View단에서 업로드한 파일을 MultipartFile타입의 변수에 담아줍니다.

// 실제로 올린 파일이 이 변수에 담겨 있는 것이죠, 저는 변수 mf에 파일을 담았습니다.


받아온 파일에 대한 정보를 변수를 통해서 뽑아냅니다. (DB와 연동을 하게 되면 파일의 사이즈나 원본파일의 이름등이 필요합니다. 예제는 DB와 연동을 하지 않고 진행하고 있습니다.)

MultipartFile에서 제공하는 주요 메서드를 몇가지 알면 유용합니다.

 

String getName();

- 파라미터의 이름을 반환해줍니다.

String getOriginalFilename(); 

- 업로드할 파일의 실제이름을 반환합니다.

long getSize();

- 업로드할 파일의 크기를 반환합니다.

boolean isEmpty()

- 업로드한 파일의 존재여부를 반환합니다.

byte[] getBytes()

- 업로드한 파일의 실제 데이터를 구합니다.

void transferTo(File dest)

- 업로드한 파일의 데이터를 저장합니다.


*여기서는 사실상 DB와 연동하지 않고 간단하게 파일을 업로드하고

다운로드하는 것을 확인하기 위해서 실질적으로 필요한 메서드는 2~3개면 됩니다.


1
  String originalFileName = mf.getOriginalFilename();
cs

앞서 설명한 것처럼 getOriginalFilename() 메서드를 통해서 업로드한 파일의 실제 이름을 가져옵니다.

그리고 이를 변수에 담아줍니다.


String saveFile = SAVE_PATH + System.currentTimeMillis() + originalFileName;

실제이름을 담은 변수 (originalFileName)와 System에서 제공해주는 currentTimeMillis() 메서드를 통해서 파일이 생성된 시간 그리고 SAVE_PATH (파일이 저장될 위치를 정해준 상수)를 사용해서 

SAVE_PATH 경로에 현재시간 + 실제파일이름을 가진 변수를 만들어줍니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
try {
                mf.transferTo(new File(safeFile));
 
               } catch (IllegalStateException e) {
 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
        }
cs



파일을 업로드하는 과정에서 에러가 발생하면 이를 처리해주고 원인을 알기 위해서 

try cactch 문을 사용하겠습니다.


1
mf.transferTo(new File(saveFile));
cs

실질적인 핵심코드라고 할 수 있습니다. 이 메서드를 통해서 실제로 파일이 SAVE_PATH 경로에 생겨나기 때문이죠

메서드를 위에 설명했듯이 transferTo(new File(saveFile))를 이용합니다. 또 위에서 만든 saveFile변수를 인자값으로 넣어서 실제로 파일을 생성합니다.


4. View단 설정

- VIew단은 form태그등을 작성하는 JSP 파일을 말합니다, 실질적으로 

우리가 홈페이지에서 보여지는 부분이죠



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 파일을 업로드하기 위해 만든 View단 -->
 
<html>
<head>
<title>Insert title here</title>
</head>
<body>
  <h1>파일 업로드 예제</h1>
 
  <form method="post" action="upload" enctype="multipart/form-data">
         <label>파일:</label>
         <input multiple="multiple" type="file" name="file1">
         <input type="submit" value="upload">
  </form>
</body>
</html>;
cs






위의 View단을 실행하면 위와 같은 화면이 나오게 되고 파일선택을 통해 업로드하고자 할 파일을 선택해주시면 됩니다. 그 후에 upload 버튼을 누르면 업로드가 진행 되는 것이죠


1
  <form method="post" action="upload" enctype="multipart/form-data">
cs

form 태그에 위치한 enctype을 꼭 설정해주셔야 합니다. 그렇지 않으면 Controller단에서 파일을 받지 못합니다.


이제 본인이 SAVE_PATH에 설정한 경로로 이동해서 파일이 실질적으로 생성되었는지 확인해주시면 되겠습니다. 파일 업로드에 대한 포스팅은 여기까지 하도록 하겠습니다. 다음에는 오늘 다루지 못했던

스프링을 통한 파일다운로드를 포스팅하도록 하겠습니다. 



반응형

관련글 더보기

댓글 영역