JAVA NAS 파일 업로드 - JAVA NAS pail eoblodeu

아기상어 뚜루루뚜루 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);
            }
        }
    }
}
테스트 결과
JAVA NAS 파일 업로드 - JAVA NAS pail eoblodeu
JAVA NAS 파일 업로드 - JAVA NAS pail eoblodeu

FileService.zip

0.00MB