스프링/4. 스프링 MVC-2

85. 서블릿으로 실제 서버에 파일 업로드

sdafdq 2023. 9. 25. 00:04

먼저, 파일을 업로드 하려면 실제 파일이 저장될 경로가 필요하다.

application.properties에 지정해주면 된다.

file.dir=G:/spring/files/

폴더의 맨 끝에 / 해야 한다.

그리고 아마 폴더 자동생성 아닐 듯

@Slf4j
@Controller
@RequestMapping("/servlet/v2")
public class ServletUploadControllerV2 {
    @Value("${file.dir}")
    private String fileDir;

    @GetMapping("/upload")
    public String newFile(){
        return "upload-form";
    }

    @PostMapping("/upload")
    public String saveFileV2(HttpServletRequest request) throws ServletException, IOException {
        log.info("request={}",request);

        String itemName = request.getParameter("itemName");
        log.info("itemName={}", itemName);

        Collection<Part> parts = request.getParts();
        log.info("parts={}",parts);
        for (Part part : parts) {
            log.info("==== PART ====");
            log.info("name = {}",part.getName());
            Collection<String> headerNames = part.getHeaderNames();
            for (String headerName : headerNames) {
                log.info("header = {} : {}",headerName,part.getHeader(headerName));
            }
            log.info("submittedFilename = {}",part.getSubmittedFileName());
            log.info("size = {}", part.getSize());

            InputStream inputStream = part.getInputStream();
            String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

            log.info("body = {}", body);
            if(StringUtils.hasText(part.getSubmittedFileName())){
                String fullPath = fileDir + part.getSubmittedFileName();
                part.write(fullPath);
            }

        }


        return "upload-form";
    }
}

application.properties에 있는 값을 저렇게

@Value(${키})

String 넣을변수이름

해서 가져올 수 있다.

 

저번에 말 했듯 각각 parts로 데이터들이 나뉘고, 그것은 헤더, 바디의 형식으로 되어 있다.

 

위는 그냥 각각의 정보들을 한번 찍어본 거고, 중요한 것은

 

if(StringUtils.hasText(part.getSubmittedFileName())){
    String fullPath = fileDir + part.getSubmittedFileName();
    part.write(fullPath);
}

이부분.

part.write(경로 + 파일이름)

이거 실제로 파일이 저장된다.

 

part.getSubmittedFileName()이 파일이름 가져오는 거.