고똘이의 IT 개발이야기

안녕하세요.

오늘은 자바 파일업로드에 관해서 설명 드리겠습니다.

 

오늘의 유틸은 자바 파일업로드를 할 경우 AJAX통신을 이용하여

파일이 변화 될때마다 파일을 업로드 하는 방식입니다.

 

정말 간단하지만 많은 분들이 개발할때 CONTROLLER마다 하나씩

만드시는 경향이 있는데 아래의 소스를 보시면 한 곳에서

 

파일을 업로드 할 수 있도록 만들었습니다.

 

1. JSP에서 파일 업로드를 위한 화면을 만듭니다.

   현재 아래의 소스를 보시면 FORM태그 안에 FILE이라는 ELEMENT를 만들었습니다.

1
2
3
4
5
6
7
8
9
 
<form id="fileForm" action="/test/file/uploadAjax" method="post" enctype="multipart/form-data">
    <span class="file" id="file">
        <input type="file" id="testUploadFile" name="file" >
        <label>파일찾기</label>
    </span>
</form>
 
 
 

 

2. AJAX를 이용하여 서버에 파일 데이터 전송.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
// 계약서 파일을 변겅 할때마다 파일 업로드를 한다.
$("#testUploadFile").change(function(){
    
    var formData = new FormData($("#fileForm")[0]);
 
    $.ajax({
        type : 'post',
        url : '/test/file/uploadAjax',
        data : formData,
        processData : false,
        dataType : "json",
        contentType : false,
        async    : false,
        success : function(data) {
            alert("파일 업로드 성공.");
        },
        error : function(error) {
            alert("파일 업로드에 실패하였습니다.");
           
        }
    });      
 
});    
 
 

 

3. 서버에서 파일 정보를 받아서 처리합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        
        // return value는 입맛에 맞게 return 해주세요.
        @PostMapping(value={"/test/file/uploadAjax"})
        @ResponseBody
        public Map<String, object> TestUploadUtil(HttpServletRequest req) throws IOException {
            
            Map<String, Object> result = new HashMap<>();
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
            
            // 파일 디렉토리
            Path uploadDir = "C:/test/fileUpload";
            
            // 업로드할 디렉토리의 경로가 없을경우 디렉토리 생성
            if(!Files.isDirectory(uploadDir)) {
                Files.createDirectories(uploadDir);
            }
            
            MultipartFile mFile = multipartRequest.getFileMap().values()
                
            UUID tempFileName = UUID.randomUUID(); 
            String originalFileName = mFile.getOriginalFilename();        // 원본 파일명
            String fileExt = FilenameUtils.getExtension(originalFileName);
                
            if(originalFileName.toLowerCase().endsWith(".tar.bz2")) {
                fileExt = "tar.bz2";
            } else if(originalFileName.toLowerCase().endsWith(".tar.gz")) {
                fileExt = "tar.gz";
            }
            // 물리파일은 확장자를 제외하고 저장한다.
            String logicalFileName = tempFileName.toString()+ "." + fileExt;
               
            byte[] fileBytes = mFile.getBytes(); // 파일을 바이트로 읽어온다.
            Path filePath = uploadDir.resolve(logicalFileName);
            Files.write(filePath, fileBytes); // 파일 생성
            return result;
                
        }
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

설명은 소스안에 들어 있어서 보시면 이해가 되실거 같습니다.

물리 파일의 확장자를 뺀것은 DB에 확장자를 저장하구 다운로드 할때

UUID로 변경된 이름의 파일명+확장자를 추가하여 다운로드 받기위해

확장자를 제거하고 저장하는 식으로 하였습니다.

 

감사합니다.

도움이 좋아요와 댓글 달아주시면 감사하겠습니다.

블로거의 도움이됩니다.

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band