[스프링 MVC 2편 - 백엔드 웹 개발 활용 기술] 섹션11. 파일업로드
파일업로드를 하기 위해서는 경로지정이 필요하다.
application.properties 에서
file.dir=C:\Users\Junsik\Desktop\file\
이런식으로 경로를 적어놓은 뒤 컨트롤러에서
@Value("${file.dir}")
private String fileDir;
이런식으로 파일경로를 가져와서 사용할 수 있다.
inputStream OutputStream이 뭔가 ???
inputstream
파일 데이터를 읽거나 네트워크 소켓을 통해 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용합니다.
outputStream
바이트 기반 출력 스트림의 최상위 추상클래스입니다.
모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속 받아 기능을 재정의 합니다.
멸티파트 형식은 전송 데이털르 하나하나 각각 부분 ("part")으로 나누어 전송한다. parts에는 이렇게 나누어진 데이터가 각각 담긴다.
서블릿이 제공하는 part 는 멀티파트 형식을 편리하게 읽을 수 있는 다양한 메서드를 제공한다.
form형식으로 데이터를 전송할려면 http body를 사용한다.
http body에는 파트별로 나뉘어져 있는데 예를들면 사용자가 폼에다가 입력하는 이름, 나이, 주소 이런 것들이 파트별로 나뉘어서
날라가게 된다.
part의 주요 메서드
part.getSubmittedFileName() 클라이언트가 전달한 파일명
part.getInputStream() Part의 전송 데이터를 읽을 수 있다.
part.write(...): Part를 통해 전송된 데이터를 저장할 수 있다.
스프링이 제공하는 파일 업로드
file.getOriginalFilename() 업로드 파일 명
file.transferTo(...) 파일 저장
@GetMapping("/attach/{itemId}")
public ResponseEntity<Resource> downloadAttach(@PathVariable Long itemId) throws MalformedURLException {
Item item = itemRepository.findById(itemId);
String storeFileName = item.getAttachFile().getStoreFileName();
String uploadFileName = item.getAttachFile().getUploadFileName();
UrlResource resource = new UrlResource("file:" + fileStore.getFullPath(storeFileName));
log.info("uploadFileName={}", uploadFileName);
String encodeUploadFileName = UriUtils.encode(uploadFileName, StandardCharsets.UTF_8);
String contentDisposition = "atachment; filename=\"" + encodeUploadFileName + "\"";
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
.body(resource);
}
uriUtills를 사용하여 파일명을 받고 filename을 Uri를 사용한 변수인 encodeUploadFIlename을 사용한다.
-> 저장하였던 파일명으로 파일이 저장된다.
responsebody -> http의 header와 body를 사용하기위해 쓰는 스프링부트 어노테이션
@Pathvariable -> url정보를 사용하기위해서 쓰는 어노테이션이다.