공부하는 블로그

Spring 파일업로드 본문

Develop/Spring

Spring 파일업로드

모아&모지리 2017. 9. 14. 14:36


파일 업로드를 해야 하는 경우 form 엘리먼트에 enctype속성을 정의한다. (게시글 올리기 form)


http://highlighttt.tistory.com/9 (참고)


1
2
3
4
5
6
 <bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <property name="maxUploadSize" value="104857600" /> <!-- 100 MB -->
          <property name="defaultEncoding" value="UTF-8" />
      
      </bean>
cs


pom.xml에 Dependency를 추가 한다. // 없을시에 https://mvnrepository.com/ 에서 찾아본다.

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
 


BoardController에 작성한다. (Controller File Upload Logic 추가)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MultipartFile file = boardVO.getFile();
        
        if( file != null && !file.isEmpty()) {
            File destFile = new File("d:/uploadFiles/" + file.getOriginalFilename()); 
                                       //저장경로            업로드할 파일이름
            /**
             * 자동으로 설정되는 예외처리를 그대로 실행한다.
             */
            try {
                file.transferTo(destFile);
            } catch (IllegalStateException e) {
                
                e.printStackTrace();
            } catch (IOException e) {
        
                e.printStackTrace();
            }
        }
cs


Upload용 파일 com.ktds.common.web 에 DownloadUtil.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.ktds.common.web;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 파일 다운로드를 유용하게 함.
 * Internet Explorer, Mozilia 모두 호환
 * @author Minchang Jang (mc.jang@hucloud.co.kr)
 *
 */
public class DownloadUtil {
 
    private String uploadPathWithFileName;
    
    public DownloadUtil(String uploadPathWithFileName) {
        this.uploadPathWithFileName = uploadPathWithFileName;
    }
    
    /**
     * 파일을 다운로드 함.
     * @param request
     * @param response
     * @param displayFileName 다운로드 할 때 사용자에게 보여질 파일의 이름
     * @throws UnsupportedEncodingException
     */
    public void download(HttpServletRequest request,
                        HttpServletResponse response,
                        String displayFileName) throws UnsupportedEncodingException {
        
        File downloadFile = new File(uploadPathWithFileName);
        
        response.setContentType("application/download; charset=utf-8");
        response.setContentLength( (int) downloadFile.length());
        
        // 사용자의 브라우져 정보를 가져온다.
        String userAgent = request.getHeader("User-Agent");
        // 사용자의 브라우저가 MicroSoft Internet Explorer 인지 확인한다.
        boolean internetExplorer = userAgent.indexOf("MSIE"> -1;
        if!internetExplorer ) {
            internetExplorer = userAgent.indexOf("Gecko"> -1;
        }
        
        // 다운로드할 파일의 이름을 브라우져별로 가져온다.
        String fileName = new String(displayFileName.getBytes(), "UTF-8");
        if ( internetExplorer ) {
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+""%20");
        }
        else {
            // File의 이름을 UTF-8 타입에서 ISO-8859-1 타입으로 변경한다.
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
        }
        
        // 브라우져가 받을 파일의 이름을 response에 등록한다.
        response.setHeader("Content-Disposition",
                "attachment; filename=\"" + fileName + "\";");
        // 브라우져가 다운로드 받은 후 Binary 파일로 생성하라고 보낸다.
        response.setHeader("Content-Transfer-Encoding""binary");
        
        FileInputStream fin = null;
        FileChannel inputChannel = null;
        WritableByteChannel outputChannel = null;
        
        try {
            fin = new FileInputStream(downloadFile);
            inputChannel = fin.getChannel();
 
            outputChannel = Channels.newChannel(response.getOutputStream());
            inputChannel.transferTo(0, fin.available(), outputChannel);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        } finally {
            try {
                if (outputChannel.isOpen())
                    outputChannel.close();
            } catch (Exception e) {}
            try {
                if (inputChannel.isOpen())
                    inputChannel.close();
            } catch (Exception e) {}
            try {
                if (fin != null)
                    fin.close();
            } catch (Exception e) {}
        }
    }
    
}
 
cs


1
2
3
4
MultipartFile file = boardVO.getFile();
        
        UploadUtil uploadUtil = new UploadUtil("d:/uploadFiles/" + file.getOriginalFilename());
        uploadUtil.uploadFile(file);
cs

파일 업로드 하면 저장경로에 업로드가 된다.



파일 업로드 확인


BoardVO에 fileName 변수 선언 Getter Setter


read.jsp파일

이렇게 첨부파일 명이 표시된다.

'Develop > Spring' 카테고리의 다른 글

Spring 개발을 위한 STS설치 설정법 (1)  (0) 2017.09.23
(Spring)ORM :MyBatis 연동 설정  (0) 2017.09.22
Spring error-page  (0) 2017.09.14
Spring Interceptor(인터셉터)  (0) 2017.09.14
Static File (CSS,JS,IMG) 설정  (0) 2017.09.13