-
Spring Boot 로 만드는 Upload와 Download Rest API 예제-05Java/Spring 2018. 12. 17. 16:09
이번 글에서는 마지막 단계 RestController에 API를 생성하고 테스트 까지 하면서 파일 업로드 다운로드 예제를 마치도록 한다.
기존에 생성한 FileUploadController에 나머지 소스를 추가한다.
추가할 api request는 총 3개를 추가한다. (단일 파일 업로드, 다중 파일 업로드, 파일 다운로드 )
1234567891011121314151617@Autowiredprivate 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 소스를 완성한다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384package 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;@RestControllerpublic class FileUploadController {private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class);@Autowiredprivate 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 ResourceResource resource = service.loadFileAsResource(fileName);// Try to determine file's content typeString 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 determinedif(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
'Java > Spring' 카테고리의 다른 글
Spring MVC 기본 설정 01 - 기본적인 pom.xml dependency 목록 (0) 2018.12.19 Spring Boot 로 만드는 Upload와 Download Rest API - JPA - Hibernate 연결하기 (0) 2018.12.18 Spring Boot 로 만드는 Upload와 Download Rest API 예제-04 (2) 2018.12.17 Spring Boot 로 만드는 Upload와 Download Rest API 예제-03 (0) 2018.12.17 Spring Boot 로 만드는 Upload와 Download Rest API 예제-02 (1) 2018.12.17 댓글