목차

JFile

개요

<보안지침사항>

  1. 회원이 업로드한 파일 위치가 DMZ 영역에 있을 경우에는 파일자체를 암호화 해야함
  2. 파일 암호화 알고리즘은 고객사가 신뢰 할 수 있는 알고리즘으로 쉽게 변경 가능해야 함
  3. 파일이 관리되는 각각의 고객사 폴더별로 암호화 알고리즘을 변경 해야 할 시에도 조치 가능해야 함
  4. 파일명을 암호화 해야 함

<사용자편의성>

  1. 크로스 부라우징을 지원해야 함
  2. ajax 기반으로 동작해야 함
  3. 파일 선택시 다중 선택이 가능해야 함
  4. 파일이 업로드 될 때 progressbar 의 움직임으로 업로드 진행상황을 확인 할 수 있어야 함
  5. 이미지파일인 경우 파일을 다운받기 전에 미리보기(preview) 가능해야 함
  6. 다운받을 파일이 복수개 일 경우 한번에 압축하여 다운로드 받을 수 있어야 함
  7. 해당업무별로 파일저장 경로를 다르게 관리 할 수 있어야 함

<고객 접근 통계>

  1. 다운로드 시 다운로드 건수 이력을 남겨야 함

<이슈 사항>

  1. 회원수 증가로 인해 월별로 생성해 놓은 디렉터리가 파일 30만건 이상 일 경우 더 이상 파일을 업로드 할수 없음
  2. 서버에 파일이 저장되는 root 폴더의 위치를 업무마다 다르게 저장하고 해야함. 예) 행정시스템 : /app/s001, 대민시스템 : /app/k001, 내부시스템 : /app/w001
  3. 시스템구성환경이 복수개의 WebServer(아파치, Webtobe…) 와 복수개의 WAS(웹로직,웹스피어…) 로 구성 되어 있을경우 파일업로드 완료 시점에 ftp 또는 sftp 를 통해 웹서버로 전송되야 함 (이미지는 웹서버에서 <img src=“이미지 URL”/> 형태로 사용하기 때문이며, 이미지를 웹서버로 전송하지 않고 WAS 에서 byte[] 형태로 서비스 할 수 있게 해주는 방법으로 구현했다가 로드러너로 부하테스트 시 CPU, Memory 과다 부하가 발생할 수 있음. 즉 파일 완료시점에 사용자가 핸들링 할 수 있는 User 이벤트를 제공해야 함)

시작하기

<관련 설정 >

  1. 테이블 생성
Script (altibase, oracle, tibero 등)
CREATE TABLE J_ATTACHFILE 
(
	FILE_ID VARCHAR2(13) NOT NULL,
	FILE_SEQ INTEGER NOT NULL,
	FILE_NAME VARCHAR2(100) NOT NULL,
	FILE_SIZE INTEGER,
	FILE_MASK VARCHAR2(100),
	DOWNLOAD_COUNT INTEGER,
	DOWNLOAD_EXPIRE_DATE VARCHAR2(8),
	DOWNLOAD_LIMIT_COUNT INTEGER,
	REG_DATE DATE,
	DELETE_YN VARCHAR2(1),
CONSTRAINT  J_ATTACHFILE_PK PRIMARY KEY (FILE_ID, FILE_SEQ)
);
Script (cubrid 등)
CREATE TABLE J_ATTACHFILE 
(
	FILE_ID VARCHAR(13) NOT NULL,
	FILE_SEQ INTEGER NOT NULL,
	FILE_NAME VARCHAR(100) NOT NULL,
	FILE_SIZE INTEGER,
	FILE_MASK VARCHAR(100),
	DOWNLOAD_COUNT INTEGER,
	DOWNLOAD_EXPIRE_DATE VARCHAR(8),
	DOWNLOAD_LIMIT_COUNT INTEGER,
	REG_DATE DATETIME,
	DELETE_YN VARCHAR(1),
CONSTRAINT  J_ATTACHFILE_PK PRIMARY KEY (FILE_ID, FILE_SEQ)
);
Script (mysql등)
CREATE TABLE J_ATTACHFILE 
(
	FILE_ID VARCHAR(13) NOT NULL,
	FILE_SEQ INT NOT NULL,
	FILE_NAME VARCHAR(100) NOT NULL,
	FILE_SIZE INT,
	FILE_MASK VARCHAR(100),
	DOWNLOAD_COUNT INT,
	DOWNLOAD_EXPIRE_DATE VARCHAR(8),
	DOWNLOAD_LIMIT_COUNT INT,
	REG_DATE DATETIME,
	DELETE_YN VARCHAR(1),
PRIMARY KEY (FILE_ID, FILE_SEQ)
);
 
CREATE UNIQUE INDEX J_ATTACHFILE_PK ON J_ATTACHFILE
(
	FILE_ID, FILE_SEQ
);
  1. AJAX 처리를 위하여 BeanNameViewResolver 등록이 필요 (WEB-INF/config/egovframework/springmvc/egov-com-serlvet.xml 참조)
BeanNameViewResolver
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"/>

API

아래의 내용은 JFile V1.0 버전에서 제공하는 JFileService API 목록이다.

/* 
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFile 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 * @param fileSeqs 파일 시퀀스 목록.
 */
public void upload(String fileId, MultipartFile multipartFile, String uploadPath, Object[] fileSeqs) ;
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFile 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 */
public void upload(String fileId, MultipartFile multipartFile, String uploadPath) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일아이디.
 * @param multipartFile 멀티파트 파일.
 * @param fileSeqs 파일 시퀀스 목록.
 */
public void upload(String fileId, MultipartFile multipartFile, Object[] fileSeqs) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일아이디.
 * @param multipartFile 멀티파트 파일.
 */
public void upload(String fileId, MultipartFile multipartFile) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFiles 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 * @param fileSeqs 파일 시퀀스 목록.
 */
public void upload(String fileId, Collection<MultipartFile> multipartFiles, String uploadPath, Object[] fileSeqs) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFiles 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 */
public void upload(String fileId, Collection<MultipartFile> multipartFiles, String uploadPath) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFiles 멀티파트 파일.
 * @param fileSeqs 파일 시퀀스 목록.
 */
public void upload(String fileId, Collection<MultipartFile> multipartFiles, Object[] fileSeqs) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param fileId 파일 아이디.
 * @param multipartFiles 멀티파트 파일.
 */
public void upload(String fileId, Collection<MultipartFile>) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param multipartFile 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 */
public void upload(MultipartFile multipartFile, String uploadPath) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param multipartFile 멀티파트 파일.
 */
public void upload(MultipartFile multipartFile) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param multipartFiles 멀티파트 파일.
 * @param uploadPath 업로드 경로.
 */
public void upload(Collection<MultipartFile> multipartFiles, String uploadPath) ;
 
 
/*
 * 파일을 업로드 한다.
 * @param multipartFiles 멀티파트 파일.
 */
public void upload(Collection<MultipartFile> multipartFiles) ;
 
 
/*
 * 파일 아이디를 조회한다.
 * @param fileId 파일아이디.
 * @param fileSeqs 파일 시퀀스 목록.
 * @return String 파일 아이디.
 */
public String getFileId(String fileId, Object[] fileSeqs);
 
 
/*
 * 파일 아이디를 조회한다.
 * @param fileId 파일아이디.
 * @return String 파일 아이디.
 */
public String getFileId(String fileId);
 
 
/*
 * 파일 아이디를 조회한다.
 * @return String 파일 아이디.
 */
public String getFileId();
 
 
/*
 * 파일업로드가 완료된 후 처리 작업을 수행한다.
 * @param fileId 파일아이디.
 * @param uploadPath 업로드 경로.
 */
public void executeAfterUploadCompleted(String fileId, String uploadPath);
 
 
/*
 * 파일업로드가 완료된 후 처리 작업을 수행한다.
 * @param fileId 파일아이디.
 */
public void executeAfterUploadCompleted(String fileId);
 
 
/*
 * 첨부파일 객체.
 * @param filePullPath 디렉터리를 포함한 전체 경로.
 * @return File 파일 객체.
 */
public File getFile(String filePullPath);
 
 
/*
 * 첨부파일 객체.
 * @param fileId 파일 아이디.
 * @return File 파일 객체.
 */
public File getFileBySequence(String fileId);
 
 
/*
 * 첨부파일 객체.
 * @param fileId 파일 아이디.
 * @param fileSeq 파일 시퀀스 목록.
 * @return File 파일 객체.
 */
public File getFileBySequence(String fileId);
 
 
/*
 * 첨부파일 객체.
 * @param fileId 파일 아이디.
 * @param fileSeq 파일 시퀀스 목록.
 * @param filePath 파일 경로.
 * @return File 파일 객체.
 */
public File getFileBySequence(String fileId, String fileSeq, String filePath);
 
 
/*
 * JFile 객체.
 * @param fileId 파일 아이디.
 * @return JFile[] 암호화 정보 및 마스킹 파일명을 포함하고 있는 파일 객체.
 */
public JFile[] getFiles(String fileId);
 
 
/*
 * JFile 객체.
 * @param fileId 파일 아이디.
 * @param uploadPath 파일 경로
* @return JFile[] 암호화 정보 및 마스킹 파일명을 포함하고 있는 파일 객체.
 */
public JFile[] getFiles(String fileId, String uploadPath);

Options

option 설명

JSP 태그 라이브러리 부분
<jwork:fileuploader
objectId="fileUploadObj1"
uploadCompletedEvent="uploadCompleted1"
beanId="jfileService"
fileType="image"
maxFileSize="100"
maxFileCount="30"
usePreview="true"
useSecurity="false"
uploadMode="db"
 />
script 부분
<script>
 // 전송 버튼 클릭 시
function send1(){ 
	fileUploadObj1.startUpload();
 }
 
 // 태그라이브러리 에서 등록한 업로드 완료 이벤트 함수 명
function uploadCompleted1(){
 fileUploadObj1.refresh();
 }
 </script>

Configuration

아래의 경우와 같이 고객사에서 요구하는 상황이 발생 했을시 개발자는 클래스 수정 없이 xml 설정 파일[context-jfile.xml]정보와 Jsp파일의 태그라이브러리에서 beanId 값의 변경 만으로 아래의 상황을 처리 할 수 있다.

  1. 기본적인 파일 업로드를 제공하는 서비스 설정 형태
/src/main/resources/egovframework/spring/com/context-jfile.xml
<aop:aspectj-autoproxy proxy-target-class="false" / ><bean class="egovframework.com.ext.jfile.aspect.MultipartResolverDisablingAspect" /><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/><bean id="download" class="egovframework.com.ext.jfile.view.DownloadView" /><bean id="jsonView" class="egovframework.com.ext.jfile.view.JSonView" /><bean id="cipherService" class="egovframework.com.ext.jfile.security.service.CipherServiceImpl" >
        <property name="jcrypto" >
           <bean class="egovframework.com.ext.jfile.security.GenericJCrypto"/ >
        </property >
     </bean>

①, ② 번은 멀티플 파일 업로드시 동일한 이름의 여러개 파일을 올리는 것을 지원하도록 해주는 방법이다. ③ 번은 Spring 에서 지원하는 멀티파트 리졸버 이다.

④ 번은 파일 다운로드를 처리하는 View 이다.

⑤ 번은 JSONObject 형태의 데이타를 주고 받을 때 사용되는 view 이다.

⑥ 번은 파일 암호화를 지원하기 위한 서비스이다. JFile 태그라이브러리에서 useSecurity='true' 일 때만 동작한다.