Spring
Spring 파일 업로드 REST API 구현하기( MultipartFile )
구티맨
2021. 8. 30. 15:04
Spring에서 파일 업로드 REST API를 만들기 위해서는 HTTP POST와 MultipartFile을 인자로 간단하게 만들 수 있습니다.
아래와 같이 컨트롤러에 Post endpoint를 만든 후, MultipartFile을 인자로 넣어줍니다.
그리고 로직을 구현할 Service 빈에 MultipartFile 객체를 넘겨줍니다.
@RestController
public class UploadController {
UploadFileService uploadFileService;
public UploadController(UploadFileService uploadFileService) {
this.uploadFileService = uploadFileService;
}
@PostMapping("/uploadFile")
public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file){
return ResponseEntity.ok(uploadFileService.uploadFile(file));
}
}
서비스 빈에서는 해당 파일에 대한 정보를 가져오고, 파일을 서버에 저장하는 로직을 구현하였습니다.
이때 파일 관련 사용한 함수는 아래와 같습니다.
file.getContentType()
: 업로드한 파일의 확장자 값을 체크합니다.( csv 파일의 경우, text/csv 값이 리턴 됩니다. )
file.getOriginalFilename()
: 업로드한 파일 이름을 리턴합니다.
file.getSize()
: 업로드한 파일의 크기(byte)를 리턴합니다.
Files.copy()
: file inputStream으로 원하는 경로에 파일을 저장할 수 있습니다.
@Service
public class UploadFileService {
private String dir = "/tmp";
private Path fileDir;
private final String TYPE_CSV = "text/csv";
@PostConstruct
public void postConstruct() {
fileDir = Paths.get(dir).toAbsolutePath().normalize();
try {
Files.createDirectories(fileDir);
} catch (IOException e) {
}
}
public UploadFile uploadFile(MultipartFile file){
if(TYPE_CSV.equals(file.getContentType()) == false){
}
String uploadFileName = StringUtils.cleanPath(file.getOriginalFilename());
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(file.getInputStream(), "UTF-8"));
} catch (IOException e) {
}
String realName = UUID.randomUUID().toString() + "_" + uploadFileName;
Path targetLocation = fileDir.resolve(realName);
try {
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
}
return UploadFile.builder()
.displayName(uploadFileName)
.size(file.getSize())
.count(fileTargetCount)
.build();
}
}
Postman으로 파일업로드 API 테스트를 해보겠습니다.
HTTP POST를 선택하고, URI를 입력 후 Body에 file키 값을 입력하고 타입을 File로 선택을 합니다.
그러면 Value에서 Select Files라고 로컬의 파일을 선택할 수 있도록 버튼이 생성 됩니다.
이를 눌러 업로드할 파일을 선택하여 Send를 눌러 API 요청을 해주면 응답을 받게 됩니다.
{
"id": 3,
"displayName": "upload_svc_no_100.csv",
"size": 6601,
"count": 100,
"uploadDateTime": "2021-08-26"
}