1. 개요

 소스를 보면 알겠지만 여기서 포인트는 "audio", "useraudio", "banner" 등에 써있는 확장자 필터링이다.

 다만 해당 소스는 절대로 완벽하지 않으며, 확장자를 명확하게 분류하기 위해서는 

Tika, URL Class에 ContentType 추출 기능을 이용해서 해당 파일을 분류하는게 맞다.

해당 소스는 어디까지나 초급자를 위한 IO 처리 방식이며, IO를 처리하기 위한 방법은 매우 다양하다.

 

※ 참고 : 

 1) IOUtils

 2) Commons-Fileupload

 3) FileUtils

 4) Spring-FileUtils

 5) FileCopyUtils 

 6) FilenameUtils

가 있으니 내 블로그 아닌 다른 블로그를 참고! => 추후 다룰 예정이기 때문.

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import main.logic.FileUpload;

public class Util {
   public static List<FileUpload> fileUpload(MultipartHttpServletRequest request,String path,String filetype) {
      SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
      //모든 업로드된 파일
      List<MultipartFile> multipartFile = request.getFiles("file");
      List<FileUpload> fileuploadList = null;
      //저장 위치 home 폴더 하위 file 하위 path
      String savefullPath = "";
      String encodeFilename ="";
      String orgFilename="";
      String shortFilename ="";
      String fileextension = "";
      String today = sf.format(new Date());
      String savefolder = request.getSession().getServletContext().getRealPath("/")+"file/"+path+"/"+today;

      Boolean isExtension =false;
      FileUpload fileUpload = null;
      String[] extension = null;
      
      //게시판
      if(path.equalsIgnoreCase("board")) {
         extension = new String[]{"jpg","png","gif","mp3","wmv","mkv","avi","mp4","xlsx"};
      } 
      
      // 오디오 업로드 확장자
      if(path.equalsIgnoreCase("audio") || path.equalsIgnoreCase("useraudio")) {
         extension = new String[]{"mp3","wma"};      
      }
      
      //배너 업로드 확장자
      if(path.equalsIgnoreCase("banner")) {
         extension = new String[] {"jpg","png","gif"};
      }

      
      //File클래스 실제 저장
      File savePath = new File(savefolder);
      
      //현재 폴더 경로
      System.out.println(savePath.getAbsolutePath());
      
      //없을 경우 자동 생성
      if(!savePath.exists()) {
         savePath.mkdirs();
         System.out.println("폴더가 생성 되었습니다.");
      }

      //파일 저장
      BufferedOutputStream bos = null;
      
      //파일 입력
      if(request != null) {
         fileuploadList =  new ArrayList<FileUpload>();
         //업로드된 파일 갯수만큼 반복
         for(MultipartFile m : multipartFile){
            fileUpload = new FileUpload();
            //파일사이즈가 0이면 파일이 없다고 판단
            if(m.getSize() <= 0) {
               continue;
            }

            orgFilename = m.getOriginalFilename().substring(0,m.getOriginalFilename().lastIndexOf("."));
            fileextension = m.getOriginalFilename().substring(m.getOriginalFilename().lastIndexOf(".")+1);
            encodeFilename = Encoder.sha256(orgFilename+System.currentTimeMillis());
            if(m.getOriginalFilename().contains(".")) {
               fileUpload.setOrgfilename(orgFilename);
               fileUpload.setFilename(encodeFilename);
               fileUpload.setShortname(shortName(encodeFilename));
            }
            
            //해당 확장자가 일치하지 않은 파일이 있을 경우 해당 파일 업로드 중지
            if(path.equalsIgnoreCase("board")) {
               for(String s: extension) {
                  if(fileextension.equalsIgnoreCase(s)) {
                     isExtension = true;
                     break;
                  } else {
                     isExtension = false;
                  }
               }
            }
            
            if(path.equalsIgnoreCase("banner")) {
               for(String s: extension) {
                  if(fileextension.equalsIgnoreCase(s)) {
                     isExtension = true;
                     break;
                  } else {
                     isExtension = false;
                  }
               }
            }

            if(path.equalsIgnoreCase("audio") || path.equalsIgnoreCase("useraudio")) {
               for(String s: extension) {
                  if(fileextension.equalsIgnoreCase(s)) {
                     isExtension = true;
                     break;
                  } else {
                     isExtension = false;
                  }
               }
            }
            
            if(!isExtension) {
               continue;
            }
            
            savefullPath = savefolder+"/"+ encodeFilename+"."+fileextension;
            String dbsaveFullPath = "/file/"+path+"/"+today+"/"+ encodeFilename+"."+fileextension;
            System.out.println(dbsaveFullPath);
            //파일 경로 = 저장폴더 + 인코딩된 원본이름 + . + 확장자
            fileUpload.setFilepath(dbsaveFullPath);
            
            //파일 용량 설정
            fileUpload.setFilesize(m.getSize());
            //아이피설정
            fileUpload.setIp(request.getRemoteAddr());
            fileUpload.setFiletype(fileextension);
            //등록일
            fileUpload.setRegdate(Util.date());
            fileUpload.setDel_yn("N");
            System.out.println(fileUpload);
            fileuploadList.add(fileUpload);
            try {
               //암호화 하여 저장
               bos = new BufferedOutputStream(new FileOutputStream(savefullPath));
               bos.write(m.getBytes());
               bos.flush();
               bos.close();
            } catch (IOException e) {
               e.printStackTrace();
            } 
         }   
      }      
      
      return fileuploadList;
   }
   
   public static String shortName(String str) {
      String shortName ="";
      for(int i=0; i<6;i++) {
         //최댓값 초과 방지 -2 ( 원래는 -1이 정상 최대길이 6이면 0부터이기 때문에 기본-1해야함)
         int random = (int)(Math.random()*str.length())-2;
         while(random <0) {
            random = (int)(Math.random()*str.length())-2;
         }
         shortName += str.substring(random, random+1);
      }
      return shortName;
   }
   
   public static String date() {
      String str = "";
      SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
      str = sf.format(new Date());
      return str;
   }
}
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기