Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • JAVA | 파일 업로드 구현하기
    ▼ Backend/자바 (JAVA) 2021. 9. 29. 11:46
    반응형

    ▶ JAVA 파일 업로드

    간단한 다중 파일 업로드 예제입니다.

    확장할 경우 파일의 크기 및 확장자를 비교하여 제한을 두거나 파일 경로에 대한 프로퍼티 관리 및 파일 데이터를 데이터베이스에 저장하여 파일관리 등을 할 수 있습니다.

     

    HTML

     

    <form id="frm" name="frm" method="post" action="/register/action" enctype="multipart/form-data">
        <input type="file" name="file1" />
        <input type="file" name="file2" />
        <input type="file" name="file3" />
        <Button type="submit">전송</Button>
    </form>

     

     

    Controller

     

    package com.melon.boot.board.web;
    
    import javax.annotation.Resource;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    import com.melon.boot.common.service.FileService;
    
    @Controller
    public class BoardController {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Resource(name = "fileService")
        FileService fileService;
    
        @PostMapping("/register/action")
        public void boardRegisterAction(MultipartHttpServletRequest multiRequest) {
            try {
                fileService.uploadFile(multiRequest);
            } catch (Exception e) {
                if (logger.isErrorEnabled()) {
                    logger.error("#Exception Message : {}", e.getMessage());
                }
            }
        }
    }

     

     

    FileService

     

    package com.melon.boot.common.service;
    
    import java.io.File;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    
    @Service("fileService")
    public class FileService {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        /**
         * 파일 업로드
         */
        public void uploadFile(MultipartHttpServletRequest multiRequest) throws Exception {
    
            // 파라미터 이름을 키로 파라미터에 해당하는 파일 정보를 값으로 하는 Map을 가져온다.
            Map < String, MultipartFile > files = multiRequest.getFileMap();
    
            // files.entrySet()의 요소를 읽어온다.
            Iterator < Entry < String, MultipartFile >> itr = files.entrySet().iterator();
    
            MultipartFile mFile;
    
            // 파일이 업로드 될 경로를 지정한다.
            // 아래의 경우 apple 사용자의 Downloads에 파일이 업로드된다.
            String filePath = "C:\\Users\\apple\\Downloads\\";
    
            // 파일명이 중복되었을 경우, 사용할 스트링 객체
            String saveFileName = "", savaFilePath = "";
    
            // 읽어 올 요소가 있으면 true, 없으면 false를 반환한다. 
            while (itr.hasNext()) {
    
                Entry < String, MultipartFile > entry = itr.next();
    
                // entry에 값을 가져온다.
                mFile = entry.getValue();
    
                // 파일명
                String fileName = mFile.getOriginalFilename();
    
                // 확장자를 제외한 파일명
                String fileCutName = fileName.substring(0, fileName.lastIndexOf("."));
    
                // 확장자
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
    
                // 저장될 경로와 파일명
                String saveFilePath = filePath + File.separator + fileName;
    
                // filePath에 해당되는 파일의 File 객체를 생성한다.
                File fileFolder = new File(filePath);
    
                if (!fileFolder.exists()) {
                    // 부모 폴더까지 포함하여 경로에 폴더를 만든다.
                    if (fileFolder.mkdirs()) {
                        logger.info("[file.mkdirs] : Success");
                    } else {
                        logger.error("[file.mkdirs] : Fail");
                    }
                }
    
                File saveFile = new File(saveFilePath);
    
                // saveFile이 File이면 true, 아니면 false
                // 파일명이 중복일 경우 파일명(1).확장자, 파일명(2).확장자 와 같은 형태로 생성한다.
                if (saveFile.isFile()) {
                    boolean _exist = true;
    
                    int index = 0;
    
                    // 동일한 파일명이 존재하지 않을때까지 반복한다.
                    while (_exist) {
                        index++;
    
                        saveFileName = fileCutName + "(" + index + ")." + fileExt;
    
                        String dictFile = filePath + File.separator + saveFileName;
    
                        _exist = new File(dictFile).isFile();
    
                        if (!_exist) {
                            savaFilePath = dictFile;
                        }
                    }
    
                    //생성한 파일 객체를 업로드 처리하지 않으면 임시파일에 저장된 파일이 자동적으로 삭제되기 때문에 transferTo(File f) 메서드를 이용해서 업로드처리한다.
                    mFile.transferTo(new File(savaFilePath));
                } else {
                    //생성한 파일 객체를 업로드 처리하지 않으면 임시파일에 저장된 파일이 자동적으로 삭제되기 때문에 transferTo(File f) 메서드를 이용해서 업로드처리한다.
                    mFile.transferTo(saveFile);
                }
            }
        }
    }

     

     

    테스트 결과

     

    FileService.zip
    0.00MB

     

    반응형

    댓글

Designed by Tistory.