ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 로 만드는 Upload와 Download Rest API 예제-05
    Java/Spring 2018. 12. 17. 16:09

    이번 글에서는 마지막 단계 RestController에 API를 생성하고 테스트 까지 하면서 파일 업로드 다운로드 예제를 마치도록 한다.



    기존에 생성한 FileUploadController에 나머지 소스를 추가한다.


    추가할 api request는 총 3개를 추가한다. (단일 파일 업로드, 다중 파일 업로드, 파일 다운로드 )


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        @Autowired
        private FileUploadDownloadService service;
     
        @PostMapping("/uploadFile")
        public FileUploadResponse uploadFile(@RequestParam("file") MultipartFile file) {
            return null;
        }
        
        @PostMapping("/uploadMultipleFiles")
        public List<FileUploadResponse> uploadMultipleFiles(@RequestParam("files") MultipartFile[] files){
            return null;
        }
        
        @GetMapping("/downloadFile/{fileName:.+}")
        public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request){
            return null;
        }
    cs



    소스를 완성한다.


    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
    package com.pang.fileuploaddemo.controller;
     
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.io.Resource;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
     
    import com.pang.fileuploaddemo.payload.FileUploadResponse;
    import com.pang.fileuploaddemo.service.FileUploadDownloadService;
     
    @RestController
    public class FileUploadController {
        private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class);
        
        @Autowired
        private FileUploadDownloadService service;
        
        @GetMapping("/")
        public String controllerMain() {
            return "Hello~ File Upload Test.";
        }
        
        @PostMapping("/uploadFile")
        public FileUploadResponse uploadFile(@RequestParam("file") MultipartFile file) {
            String fileName = service.storeFile(file);
            
            String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                                    .path("/downloadFile/")
                                    .path(fileName)
                                    .toUriString();
            
            return new FileUploadResponse(fileName, fileDownloadUri, file.getContentType(), file.getSize());
        }
        
        @PostMapping("/uploadMultipleFiles")
        public List<FileUploadResponse> uploadMultipleFiles(@RequestParam("files") MultipartFile[] files){
            return Arrays.asList(files)
                    .stream()
                    .map(file -> uploadFile(file))
                    .collect(Collectors.toList());
        }
        
        @GetMapping("/downloadFile/{fileName:.+}")
        public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request){
             // Load file as Resource
            Resource resource = service.loadFileAsResource(fileName);
     
            // Try to determine file's content type
            String contentType = null;
            try {
                contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
            } catch (IOException ex) {
                logger.info("Could not determine file type.");
            }
     
            // Fallback to the default content type if type could not be determined
            if(contentType == null) {
                contentType = "application/octet-stream";
            }
     
            return ResponseEntity.ok()
                    .contentType(MediaType.parseMediaType(contentType))
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                    .body(resource);
        }
    }
     
    cs



    소스가 완성 되었으니 프로젝트를 구동해보자.



    콘솔창이 정상적으로 로그가 찍힌다면 소스는 문제가 없다. 




    테스트


    파일업로드와 테스트가 정상적으로 동작하는지 테스트를 해보자.


    단일 업로드 테스트

    프론트 단을 개발하지 않았기 때문에 테스트 하기 위해서는 Postman이라는 application이 필요하다.


    Postman을 실행하고 아래 그림같이 작성한 후에 명령을 보내보자.



    Spring Boot 프로젝트가 정상적으로 구동되고 있고 Http Request가 제대로 입력 됐으면 아래와 같은 response 를 받게 된다.



    만약 데이터를 추가하지 않고 보내게 되면 우리가 추가한 CustomException 의 메세지가 출력 된다.




    다중 파일 업로드 테스트

    다중 파일 업로드도 동일한 방식으로 테스트 해본다.




    파일 다운로드 테스트

    파일 업로드시 response로 받은 json 데이터에서 fileDownloadUri의 주소를 복사하여 호출해보면 파일이 정상적으로 다운로드가 된다.



    이로써 Spring Boot를 이용한 기본적이 파일 업로드/다운로드 예제가 끝났다.


    여기에 DB도 붙일 수 있고 다른 기능들도 추가해서 우리가 원하고자 하는 기능을 추가할 수가 있다. 


    지속적으로 반복 복습하면서 입맛에 맞게 수정도 하면서 공부를 해봐야겠다.


    2018/12/17 - [Java/Spring] - Spring Boot 로 만드는 Upload와 Download Rest API 예제-01

    2018/12/17 - [Java/Spring] - Spring Boot 로 만드는 Upload와 Download Rest API 예제-02

    2018/12/17 - [Java/Spring] - Spring Boot 로 만드는 Upload와 Download Rest API 예제-03

    2018/12/17 - [Java/Spring] - Spring Boot 로 만드는 Upload와 Download Rest API 예제-04


    댓글

Designed by Tistory.