자바

 

tika 라이브러리 추가

	<dependency>
		    <groupId>org.apache.tika</groupId>
		    <artifactId>tika-core</artifactId>
		    <version>2.7.0</version>
		</dependency>

 

 

만약 오류 및 작동이 안될 경우 추가

	<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.2</version>
    </dependency>

 

★ inputStream 닫아주도록 한다. 닫지 않으면 오류

    /** Tika 라이브러리로 첨부파일 확장자 검사 */
    public  boolean isPermisionFileMimeType( InputStream inputStream ) {
        try {
            //final String[] PERMISSION_FILE_MIME_TYPE = {"image/gif", "image/jpeg", "image/png", "image/bmp", "application/pdf", "video/mp4"};
            final String[] PERMISSION_FILE_MIME_TYPE = {"image/jpeg", "image/png"};

            String mimeType = new Tika().detect(inputStream);
            for( int i = 0; i < PERMISSION_FILE_MIME_TYPE.length; i++ ) {
                if( PERMISSION_FILE_MIME_TYPE[i].equals(mimeType) ) {
                    return true;
                }
            }
            return false;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }finally {
            try {
                inputStream.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }

    }

 

 

 

 

 

import java.io.File;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.tika.Tika;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import lineage.choco.controller.FileUploadController;
import lineage.choco.model.vo.AttachVO;
import lombok.extern.slf4j.Slf4j;


/**
 * 
 * https://brilliantdevelop.tistory.com/111
 *
 */

@Component
@Slf4j
public class AttachUtils {
	
	
	@Value("${upload.path}")
	public String uploadPath;
	

	/** 다중 MultipartFile에서 VO 설정 및 업로드 파일 처리 후 List 리턴 
	 * @throws Exception */
	public List<AttachVO> getAttachListByMultiparts(MultipartFile[] boFiles,  String boardType, String path)
			throws Exception {
		List<AttachVO> atchList = new ArrayList<AttachVO>();
		for (int i = 0; i < boFiles.length; i++) {
			MultipartFile multipart = boFiles[i];
			AttachVO vo = this.getAttachByMultipart(multipart,boardType, path);
			if (vo != null) {
				atchList.add(vo);
			}
		}
		return atchList;
	}

	/** MultipartFile에서 VO 설정 및 업로드 파일 처리 후 리턴, 없는 경우 null 
	 * @throws Exception */
	public AttachVO getAttachByMultipart(MultipartFile multipart, String boardType, String path) throws Exception {
		
		if (!multipart.isEmpty() ) {
			
			//파일 확장자 체크 - 이상 있으면  null 값 반환 처리
			InputStream inputStream = multipart.getInputStream();
			if(!isPermisionFileMimeType(inputStream)) return null;
			
			
			AttachVO vo = new AttachVO();
			vo.setBoardType(boardType);
			vo.setAtchOriginalName(multipart.getOriginalFilename());
			vo.setAtchFileSize(multipart.getSize());
			vo.setAtchPath(path);
			File file = new File(uploadPath + path);
	        if(!file.isDirectory()) {
	        	file.mkdirs();
	        }
	        
			vo.setAtchFileName(FileUploadController.uploadFile(uploadPath + path, multipart.getOriginalFilename(), multipart.getBytes(), null));
			vo.setAtchFancySize(fancySize(multipart.getSize()));
	        return vo;
		} else {
			return null;
		}
	}

	
	private boolean isPermisionFileMimeType(  InputStream inputStream ) throws Exception {
			//final String[] PERMISSION_FILE_MIME_TYPE = {"image/gif", "image/jpeg", "image/png", "image/bmp", "application/pdf", "video/mp4"};
			final String[] PERMISSION_FILE_MIME_TYPE = {"application/zip"};

			String mimeType = new Tika().detect(inputStream);
			for( int i = 0; i < PERMISSION_FILE_MIME_TYPE.length; i++ ) {
				if( PERMISSION_FILE_MIME_TYPE[i].equals(mimeType) ) {
					return true;
				}
			}
			return false;
	}


	
	
	
	private DecimalFormat df = new DecimalFormat("#,###.0");

	private String fancySize(long size) {
		if (size < 1024) { // 1k 미만
			return size + " Bytes";
		} else if (size < (1024 * 1024)) { // 1M 미만
			return df.format(size / 1024.0) + " KB";
		} else if (size < (1024 * 1024 * 1024)) { // 1G 미만
			return df.format(size / (1024.0 * 1024.0)) + " MB";
		} else {
			return df.format(size / (1024.0 * 1024.0 * 1024.0)) + " GB";
		}
	}

}

 

 

 

 

 

 

 

 

js 프론트에서 확장자 체크

 

$(document).ready(function() {
    $("input:file[name='uploadfile']").change(function () {
        var str = $(this).val();
        var fileName = str.split('\\').pop().toLowerCase();
        //alert(fileName);
 
        if(!checkFileName(fileName)){
        	$(this).val("");
        }
    });
});
 
 
function checkFileName(str){
 
    //1. 확장자 체크
    var ext =  str.split('.').pop().toLowerCase();
    if($.inArray(ext, ['zip']) == -1) {
        //alert(ext);
        alert(ext+'파일은 업로드 하실 수 없습니다.');

        return false;
    }
 
    //2. 파일명에 특수문자 체크
    var pattern =   /[\{\}\/?,;:|*~`!^\+<>@\#$%&\\\=\'\"]/gi;
    if(pattern.test(str) ){
        //alert("파일명에 허용된 특수문자는 '-', '_', '(', ')', '[', ']', '.' 입니다.");
        alert('파일명에 특수문자를 제거해주세요.');
        
        return false;
    }
    
    return true;
}

 

 

 

 

파일 업로드 용량 체크

/* 업로드 체크 */
function fileCheck(e){
       // 사이즈체크
     const maxSize  = 10 * 1024 * 1024    //10MB
     let fileSize = 0;

	// 브라우저 확인
	const browser=navigator.appName;
	
	// 익스플로러일 경우
	if (browser=="Microsoft Internet Explorer"){
		var oas = new ActiveXObject("Scripting.FileSystemObject");
		fileSize = oas.getFile( file.value ).size;
	}else{
		fileSize = e.files[0].size;
	}

    if(fileSize > maxSize){
          alert("첨부파일 사이즈는 10MB 이내로 등록 가능합니다.    ");
          $(e).val("");
          return;
    }
}

 

적용

<input type="file" name="uploadfile" class="form-control uploadfile" onchange="fileCheck(this)" >

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

축은 축대로 붙는다 , 학식이나 인격이 서로 비슷한 사람끼리 모인다는 말.

댓글 ( 4)

댓글 남기기

작성