본문 바로가기
Backend/Spring Framework

[Java/Spring] 파일 다중업로드 기능 구현

by 지구 2018. 5. 16.

파일 단일업로드, 파일 다중업로드, 파일 중복체크를 개발한 것에 대한 내용을 정리한다 :)

 

우선 화면에서 form 태그를 생성하는데, 여기서 중요한건 2가지가 있다.

<form name="detailForm" method="post" enctype="multipart/form-data">
	<input type="file" multiple="multiple" name="file" class="ct_input_g">
    ...
</form>

1. form 태그의 { enctype="multipart/form-data" } -> 파일 업로드 기능을 사용할 수 있게 한다.

2. input 태그의 { type="file", multiple="multiple" } -> 파일 다중업로드가 가능하도록 한다.

 

이렇게 파일을 올렸다면, Controller 에서 인자로 HttpServletRequest 말고 MultipartHttpServletRequest 를 받아야 한다.

MultipartHttpServletRequest :
HttpServletRequest 를 상속받았기 때문에, HttpServletRequest 기능 그대로 쓸 수 있으며 확장된 기능(파일)이 많아서 편하다.

또, ~Request 를 활용하면 파일 저장경로는 하드코딩하지 않아도 된다 ㅎㅎ.

@RequestMapping(value="addProduct", method=RequestMethod.POST)
public String addProduct( @ModelAttribute("product") Product product, MultipartHttpServletRequest request,
                          @RequestParam("file") MultipartFile[] file ) throws Exception {

    //String uploadPath = request.getSession().getServletContext().getRealPath("/");
    String uploadPath = request.getRealPath("/images/uploadFiles");
    String fileOriginName = "";
    String fileMultiName = "";
    for(int i=0; i<file.length; i++) {
        fileOriginName = file[i].getOriginalFilename();
        System.out.println("기존 파일명 : "+fileOriginName);
        SimpleDateFormat formatter = new SimpleDateFormat("YYYYMMDD_HHMMSS_"+i);
        Calendar now = Calendar.getInstance();
        
        //확장자명
        String extension = fileOriginName.split("\\.")[1];
        
        //fileOriginName에 날짜+.+확장자명으로 저장시킴.
        fileOriginName = formatter.format(now.getTime())+"."+extension;
        System.out.println("변경된 파일명 : "+fileOriginName);
        
        File f = new File(uploadPath+"\\"+fileOriginName);
        file[i].transferTo(f);
        if(i==0) { fileMultiName += fileOriginName; }
        else{ fileMultiName += ","+fileOriginName; }
    }
    System.out.println("*"+fileMultiName);
    product.setFileName(fileMultiName);
    
    productService.addProduct(product);
    
    return "forward:/product/getProduct.jsp";
    
}
반응형

댓글