본문 바로가기

웹/spring

spring --9. 파일 업로드

A>common-fileupload 사용시

a> pom.xml 에 추가 해야 할 것들

 

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

 

 

 

b> servlet-context.xml에 추가해야 할 것들

1.multipartResolver

1
2
3
4
5
6
7
8
9
10
11
12
<beans:bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="defaultEncoding" value="utf-8"></beans:property>
        <!-- 1024 * 1024 * 10 bytes 10MB -->
        <beans:property name="maxUploadSize" value="104857560"></beans:property>
        <!-- 1024 * 1024 * 2 bytes 2MB -->
        <beans:property name="maxUploadSizePerFile"
            value="2097152"></beans:property>
        <beans:property name="uploadTempDir"
            value="file:/C:/upload/tmp"></beans:property>
        <beans:property name="maxInMemorySize" value="10485756"></beans:property>
</beans:bean>
cs

 

 

 

 

B서블릿 3.0 이상에서 .form 태그를 이용하는 방식

a> web.xml 에 추가해야 할 것들

서블릿 3.0 이상이라면 그냥 

web.xml에 추가만 해도 된다.

 <multipart-config>

      <location>C:\\upload\\temp</location>

      <max-file-size>20971520</max-file-size> <!--1MB * 20 -->

      <max-request-size>41943040</max-request-size><!-- 40MB -->

      <file-size-threshold>20971520</file-size-threshold> <!-- 20MB -->

    </multipart-config>

 

b> servlet-context.xml 에 추가해야 할 것들

1
2
3
<beans:bean id="multipartResolver"
        class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
    </beans:bean>
cs

 

c> form의 형태

1
2
3
4
5
6
<form action="uploadFormAction" method="post" enctype="multipart/form-data">
<input type='file' name='uploadFile' multiple>
<button>Submit</button>
 
cs

 

d> 컨트롤러 작성

이런식으로 하면된다.

1
2
3
4
5
6
7
8
9
11
12
14
15
  
  @PostMapping("/uploadFormAction")
  public void uploadFormPost(MultipartFile[] uploadFile, Model model) {
    
    for (MultipartFile multipartFile : uploadFile) {
      
      log.info("-------------------------------------");
      log.info("Upload File Name: " +multipartFile.getOriginalFilename());
      log.info("Upload File Size: " +multipartFile.getSize());
    }
  }
}
 
cs

jsp에서 날아온 file객체들은 MulitpartFile[] 형태로 날아온다.

 

e> MultipartFile 의 메서드

String getName( )

파라미터의 이름 <input> 태그의 이름

String getOriginalFileName( )

업로드되는 파일의 이름

boolean isEmpty( )

파일이 존재하지 않는 경우 true

long getSize( )

업로드되는 파일의 크기

byte[ ] getBytes( )

byte[ ]로 파일 데이터 반환

InputStream getInputStream( )

파일데이터와 연결된 InputStream을 반환

transferTo(File file)

파일의 저장

 

f> 자바코드

1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());
      try {
 
        multipartFile.transferTo(saveFile);
 
      } catch (Exception e) {
 
        log.error(e.getMessage());
 
      }//end catch
cs

 

C> AJAX 를 이용한 파일 업로드

a>script 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
<script>
$(document).ready(function(){
  
  $("#uploadBtn").on("click", function(e){
 
    var formData = new FormData();
    
    var inputFile = $("input[name='uploadFile']");
    
    var files = inputFile[0].files;
    
    console.log(files);
    
  });  
});
</script>  
end catch
cs

 

b>ajax 코드

processData속성과 contentType속성의 조절이 필수

1
2
3
4
5
6
7
8
9
10
    $.ajax({
        url: '/uploadAjaxAction',
          processData: false,
          contentType: false,
          data: formData,
          type: 'POST',
          success: function(result){
              alert("Uploaded");
          }
      }); 
cs

 

c> 동일한 파일 이름 업로드를 위한 컨트롤러

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
@PostMapping(value = "/uploadAjaxAction", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public ResponseEntity<List<AttachFileDTO>> uploadAjaxPost(MultipartFile[] uploadFile) {
 
        List<AttachFileDTO> list = new ArrayList<>();
        String uploadFolder = "C:\\upload\\temp";
 
        String uploadFolderPath = getFolder();
        // make folder --------
        File uploadPath = new File(uploadFolder, uploadFolderPath);
 
        if (uploadPath.exists() == false) {
            uploadPath.mkdirs();
        }
        // make yyyy/MM/dd folder
 
        for (MultipartFile multipartFile : uploadFile) {
 
            AttachFileDTO attachDTO = new AttachFileDTO();
 
            String uploadFileName = multipartFile.getOriginalFilename();
 
            // IE has file path
            uploadFileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\"+ 1);
            log.info("only file name: " + uploadFileName);
            attachDTO.setFileName(uploadFileName);
 
            UUID uuid = UUID.randomUUID();
 
            uploadFileName = uuid.toString() + "_" + uploadFileName;
 
            try {
                File saveFile = new File(uploadPath, uploadFileName);
                multipartFile.transferTo(saveFile);
 
                attachDTO.setUuid(uuid.toString());
                attachDTO.setUploadPath(uploadFolderPath);
 
                // check image type file
                if (checkImageType(saveFile)) {
 
                    attachDTO.setImage(true);
 
                    FileOutputStream thumbnail = new FileOutputStream(new File(uploadPath, "s_" + uploadFileName));
 
                    Thumbnailator.createThumbnail(multipartFile.getInputStream(), thumbnail, 100100);
 
                    thumbnail.close();
                }
 
                // add to List
                list.add(attachDTO);
 
            } catch (Exception e) {
                e.printStackTrace();
            }
 
        } // end for
        return new ResponseEntity<>(list, HttpStatus.OK);
    } 
cs

 

 

' > spring' 카테고리의 다른 글

spring --11. RESTful API  (0) 2021.02.25
spring --11.예외처리  (0) 2021.02.22
spring --0. 설정  (0) 2021.02.22
spring --8.MVC  (0) 2021.02.19
spring --7. 로그  (0) 2021.02.19