파일 업로드/다운로드 가이드

업로드

Upload/MultiUpload

기본 설정

Upload나 MultiUpload 컴포넌트를 이용하여 파일을 업로드할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래와 같은 설정을 추가하십시오.

파일 업로드를 위한 websquare.xml 설정 항목

항목

설명

baseDir

파일이 업로드되는 기본 경로.

  • 실제 파일이 생성되는 경로는 "baseDir+folderName"입니다.

  • folderNameuploadMode에 따라 결정됩니다.

subDir1

baseDir의 하위 태그.

  • (각 사이트 별로) 하위 경로를 추가로 설정할 수 있습니다.

  • 화면 개발자는 baseDir 대신 subDir1을 Upload 또는 MultiUpload 컴포넌트의 subDir 속성으로 지정해야 합니다. (아래 예제에서, Upload 컴포넌트의 subDir 속성이 지정되지 않은 경우, D:\upload\가 파일 업로드 경로가 됩니다. subDir 속성이 "SubDir1"인 경우, D:\upload\test1\이 업로드 경로가 됩니다.)

encoding

업로드할 파일의 인코딩 방법

duplicatedFilePostFix

동일한 이름의 파일이 존재할 경우 업로드 하는 파일에 추가할 postfix

maxUploadSize

업로드할 파일의 최대 크기 (단위: Byte)

subSize1

maxUploadSize 하위 태그.

  • (각 사이트 별로) 최대 크기를 변경 가능합니다.

  • 화면 개발자는 사이트 별로 지정된 최대 크기를 사용할 경우 Upload 또는 MultiUpload 컴포넌트의 subSize 속성으로 subSize1을 지정해야 합니다. (아래의 예제에서 Upload 컴포넌트의 subSize 속성이 지정되지 않은 경우, maxUploadSize와 동일한 5000000을 사용합니다. subSize속성이 subSize1인 경우, 100000을 사용합니다.)

deniedExtension

업로드에서 제외할 파일의 확장자

  • allowedExtension 보다 우선합니다.

allowedExtension

업로드 가능한 파일의 확장자

uploadMode

폴더 이름 생성 규칙 - session 혹은 random (기본값: session)


session :

  • request 세션에 folderName 값이 등록된 경우 해당 값을 폴더명으로 사용. (예: session.getAttribute(“folderName”))

  • request 세션에 folderName 값이 없는 경우, 해당 값을 폴더명으로 사용.

  • foderName이 없는 경우 폴더명을 임의로 생성.


random:

  • folderName으로 지정된 값을 폴더명으로 사용.

  • folderName이 없는 경우 폴더명을 임의로 생성.

folderName

파일을 업로드할 폴더명. (uploadMode에서 참조.)

fileDefiner

파일 업로드 경로 및 파일 이름을 정의하는 사용자 정의 클래스의 전체 경로.

  • 사용자 정의 클래스는 AbstractUploadFileDefiner를 상속하여 (풀 패키지를 포함하여) 구현.

  • 지정하지 않는 경우, websquare.upload.handl.impl.DefaultUploadFileDefinerImpl를 사용.

(fileDefiner 구현 참조.)

decrypt

파일을 업로드 후 DRM 암호화 해제애 필요한 클래스의 전체 경로.

  • 암호화 해제 클래스는 websquare.upload.handl.AbstractUploaDecrypter를 상속받아 생성함.

(decrypt 구현 참조.)

decrypt/@tempDir

DRM 암호화 해제를 위한 임시 폴더.

removeKeyPath

업로드 결과 반환 시 경로 정보 삭제 여부. (true 혹은 false)

$r_title(websquare.xml 설정 예)
<upload>
  <baseDir value="D:\upload\">
    <subDir1 value="D:\uplaod\test1\"/>
    <subDir2 value="D:\uplaod\test2\"/>
    <!-- … subDir is changeable. -->
  </baseDir>
  <encoding value="UTF-8"/>
  <duplicatedFilePostFix value="yyyy-MM-dd(HH mm ss)"/>
  <maxUploadSize value="5000000">
    <subSize1 value="100000"/>
    <subSize2 value="1000000"/>
  </maxUploadSize>
  <deniedExtension>
    cmd,exe,none
  </deniedExtension>
  <allowedExtension>
    gif, jpg, doc, xls, ppt, pdf, txt, csv, xlsx
  </allowedExtension>
  <uploadMode value="session"/>
  <folderName value="uploadFolerName"/>
  <fileDefiner value="websquare.upload.handl.impl.DefaultUploadFileDefinerImpl"/>
  <decrypt value="com.inswave.Decrypt" tempDir="/TEMPDIR" />
  <callback>
      <removeKeyPath value="true" />
  </callback>
</upload>

fileDefiner 구현

파일 업로드 경로를 기본 설정으로 충족할 수 없는 경우, 아래의 방법으로 경로를 재정의하십시오.

  1. websquare.upload.handl.AbstractUploadFileDefiner를 상속받습니다.

  2. 리턴값이 StringgetFileNamegetFilePath를 구현합니다.

실제 생성되는 파일은 "getFilePath의 결과값 + File.separator+getFileName의 결과값"입니다. 아래 예제의 useDir과 같은 사용자 파라미터를 화면에서 파라미터로 전달할 수 있으며, Server는 MultipartParameterMap을 통해 String Array로 반환하여 사용합니다.

$r_title(Upload 컴포넌트 용 스크립트 예)
upload1.addParam( "useDir" , "useDir_value" );
upload1.submit();
$r_title(MultiUpload 컴포넌트 용 스크립트 예)
multiupload1.setParam( 0 , "useDir" , "useDir_value_m")
multiupload1.startUpload();
$r_title(fileDefiner 구현 예)
import javax.servlet.http.HttpServletRequest;

import websquare.http.MultiPartHttpServletRequest;
import websquare.http.WebSquareContext;
import websquare.upload.handl.AbstractUploadFileDefiner;

public class DefaultUploadFileDefinerImpl extends AbstractUploadFileDefiner {
	/**
	 * @param <String:Y> clientFileName     : 클라이언트에서 선택한 파일명
	 * @param <String:Y> originalFileName   : 물리적으로 저장될 파일명
	 * @desc 파일명을 변경한다.
	 */
	@Override
	public String getFileName(String clientFileName, String originalFileName) throws Exception {
		// 파일명에 대한 별도 변경 처리시 추가한다.
		System.out.println("\nclientFileName : [" + clientFileName + "]");
		System.out.println("\noriginalFileName : [" + originalFileName + "]");
		return originalFileName;
	}
	/**
	 * @param <String:Y> filePath           : 물리적으로 저장될 파일 경로
	 * @desc 파일 저장 경로를 변경한다.
	 */
	@Override
	public String getFilePath(String filePath) throws Exception {
		
		// 파일업로드는 WAS의 공유볼륨에 저장된다. 파일 저장위치는 {websquare_home}/config/websquare.xml 의 baseDir에 위치한다.)
		// 업로드컴퍼넌트의 useDir 파라메타가 있을때 baseDir 하위에 폴더를 생성하고 저장한다.
		HttpServletRequest          request          = WebSquareContext.getContext().getRequest();
		MultiPartHttpServletRequest multiPartRequest = (MultiPartHttpServletRequest)request;
		
		Map parmeterMap = multiPartRequest.getMultipartParameters();
		
		String[] useDir = (String[])parmeterMap.get("useDir");
		
		String _filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));
		StringBuffer rt = new StringBuffer(_filePath);
		
		if (useDir != null) {
			int iCnt = useDir.length;
			for (int idx = 0; idx < iCnt; idx++) {
				if (idx == 0) rt.append(File.separator);
				rt.append(useDir[idx]);
			}
		}
		
		System.out.println("filePath ==: " + _filePath);
		System.out.println("rt.toString() ==: " + rt.toString());
		
		return rt.toString();
	}
}

decrypt 구현

DRM과의 연계가 필요한 경우, DRM 암호화 해제 후 파일을 반환하는 클래스를 아래와 같이 구현하십시오.

  1. websquare.upload.handl.AbstractUploaDecrypter 를 상속받습니다.

  2. 리턴값이 Filedecrypt를 구현합니다.

$r_title(decrypt 구현 예)
import java.io.File;
import websquare.upload.handl.AbstractUploaDecrypter;
import com.fasoo.adk.packager.WorkPackager;

public class ExcelUpDecripterWithFasoo  extends AbstractUploaDecrypter {
	/**
	 * @param <File:Y> file         : 클라이언트에서 선택한 파일명
	 * @desc 엑셀파일 -> WebSquare GridView 업로드시 복호화 연계
	 */
	public File decrypt(File file) throws Exception {
		// 1. 클라이언트에서 upload한 파일을 복호화 연계 처리를 구현 한다.(넘겨받는 file은 extractFilePath에 저장된다.)
		// 2. 복호화된 파일을 return 한다.
		String strFsdinitDir   = "/TMAX/wq/FSD/fsdinit";						// 설정파일경로
		String serverid        = "0123456789";				// 사이트 고유 코드
		String extractFilePath = "/TMAX/wq/tempUpload/excel/extractFilePath";	// 복호화파일경로
		// String packageFilePath = "/TMAX/wq/tempUpload/excel/packageFilePath";	// 암호화파일경로
		
		String fileName = file.getName();
		String packageFile = extractFilePath + File.separator + fileName;
		
		WorkPackager oWorkPackager = new WorkPackager();
		oWorkPackager.setOverWriteFlag(true);									// 덮어쓰기
		// oWorkPackager.setCharset("UTF-8");									// 케릭터셋 설정
		oWorkPackager.setCharset("eucKR");
		// oWorkPackager.setCharset("KSC5601");
		
		if (oWorkPackager.IsPackageFile(packageFile)) {
			
			boolean bret = oWorkPackager.DoExtract(strFsdinitDir, serverid, packageFile, packageFile);
			
			if (bret) {
				System.out.println("복호화 성공.[" + packageFile + "]");
				return new File(packageFile);
			} else {
				System.out.println("복호화 중 오류입니다.");
				System.out.println(" 오류 정보..");
				System.out.println(" [" + oWorkPackager.getLastErrorNum() + "] " + oWorkPackager.getLastErrorStr());
			}
		}
		return file;
	}
}

Editor (이미지)

기본 설정

Editor 컴포넌트를 이용하여 이미지를 업로드하거나 추가할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래와 같은 설정을 추가하십시오.

이미지 업로드를 위한 websquare.xml 설정 항목

항목

설명

baseDir

파일이 업로드되는 기본 경로.

  • 실제 파일이 생성되는 경로는 "baseDir+folderName"입니다.

  • folderNameuploadMode에 따라 결정됩니다.

subDir

baseDir의 하위 태그.

  • (각 사이트 별로) 하위 경로를 추가로 설정할 수 있습니다.

  • 화면 개발자는 baseDir 대신 subDir1을 Editor 컴포넌트의 subDir 속성으로 지정해야 합니다. (아래의 예제에서, Editor 컴포넌트의 subDir 속성이 빈 값인 경우, D:\upload\가 이미지 업로드 경로가 됩니다. subDir 속성이 "SubDir1"인 경우, D:\upload\test1\이 업로드 경로가 됩니다.)

  • Editor에 포함된 이미지는 subDir 속성값만 사용합니다. (즉, Editor를 통해 업로드한 이미지가 baseDir과 subDir로 업로드되지 않고 동일한 폴더로 업로드됩니다.)

deniedExtension

업로드에서 제외할 파일의 확장자

  • allowedExtension 보다 우선합니다.

allowedExtension

업로드 가능한 파일의 확장자

imageDefiner

  • 파일 업로드 경로 및 파일 이름을 정의하는 사용자 정의 클래스의 전체 경로.

  • 사용자 정의 클래스는 AbstractUploadImageDefiner를 상속하여 (풀 패키지를 포함하여) 구현.

  • 지정하지 않은 경우, websquare.upload.handl.impl.DefaultUploadImageDefinerImpl를 사용.

$r_title(websquare.xml 설정 예)
<upload>
    <imgUpload>
        <baseDir value="D:\upload\image"
			<subDir1 value="D:\upload\image\test1" />
		</baseDir>
		<allowedExtension>
            png,jpg,gif,jpeg,tiff,bmp
  			</allowedExtension>
    	<deniedExtension>
    	</deniedExtension>
    	<!--
            파일명을 변경하기 위해 업로드 경로 및 사용자 정의 클래스를 선언
    	-->
   	<imageDefiner value="websquare.upload.handl.impl.DefaultUploadImageDefinerImpl"/>
   	</imgUpload>
</upload>

imageDefiner 구현

이미지를 업로드 경로를 기본 설정으로 충족할 수 없는 경우, 아래의 방법으로 경로를 다시 정의하십시오.

  1. websquare.upload.handl.AbstractUploadImageDefiner를 상속받습니다.

  2. 리턴값이 StringgetFileNamegetFilePath를 구현합니다.

실제 생성되는 파일은 "getFilePath의 결과값+File.separator+getFileName의 결과값"입니다.

$r_title(imageDefiner 구현 예)
import javax.servlet.http.HttpServletRequest;

import websquare.http.MultiPartHttpServletRequest;
import websquare.http.WebSquareContext;
import websquare.upload.handl.AbstractUploadImageDefiner;

public class DefaultUploadFileDefinerImpl extends AbstractUploadImageDefiner {
	/**
	 * @param <String:Y> clientFileName     : 클라이언트에서 선택한 파일명
	 * @param <String:Y> originalFileName   : 물리적으로 저장될 파일명
	 * @desc 파일명을 변경한다.
	 */
	@Override
	public String getFileName(String clientFileName, String originalFileName) throws Exception {
		// 파일명에 대한 별도 변경 처리시 추가한다.
		System.out.println("\nclientFileName : [" + clientFileName + "]");
		System.out.println("\noriginalFileName : [" + originalFileName + "]");
		return originalFileName;
	}
	/**
	 * @param <String:Y> filePath           : 물리적으로 저장될 파일 경로
	 * @desc 파일 저장 경로를 변경한다.
	 */
	@Override
	public String getFilePath(String filePath) throws Exception {
		
		// 파일업로드는 WAS의 공유볼륨에 저장된다. 파일 저장위치는 {websquare_home}/config/websquare.xml 의 baseDir에 위치한다.)
		// 업로드컴퍼넌트의 useDir 파라메타가 있을때 baseDir 하위에 폴더를 생성하고 저장한다.
		HttpServletRequest          request          = WebSquareContext.getContext().getRequest();
		MultiPartHttpServletRequest multiPartRequest = (MultiPartHttpServletRequest)request;
		
		Map parmeterMap = multiPartRequest.getMultipartParameters();
		
		String[] useDir = (String[])parmeterMap.get("useDir");
		
		String _filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));
		StringBuffer rt = new StringBuffer(_filePath);
		
		if (useDir != null) {
			int iCnt = useDir.length;
			for (int idx = 0; idx < iCnt; idx++) {
				if (idx == 0) rt.append(File.separator);
				rt.append(useDir[idx]);
			}
		}
		
		System.out.println("filePath ==: " + _filePath);
		System.out.println("rt.toString() ==: " + rt.toString());
		
		return rt.toString();
	}
}

GridView

Excel

기본 설정

GridView 컴포넌트에 Excel 파일을 업로드할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래의 설정을 추가하십시오.

Excel 파일 업로드를 위한 websquare.xml 설정 항목

항목

설명

decrypt

Excel/CSV 파일을 업로드 후 DRM 암호화 해제에 필요한 클래스의 전체 경로.

  • 암호화 해제 클래스는 websquare.upload.handl.AbstractUploaDecrypter를 상속받아 구현.

(decrypt 구현 참조.)

decrypt/@tempDir

DRM 암호화 해제를 위한 임시 폴더.

dataConvertor

각 셀의 데이터를 가공할 경우, 가공된 셀 데이터를 반환하는 클래스의 전체 경로.

  • 셀 데이터 가공용 클래스는 websquare.http.controller.grid.excel.read.ICellDataProvider 를 상속받아 구현.

(dataConverter 구현 참조.)

loadingMode

셀 데이터 읽는 방법 - SAX 혹은 POI. (기본값: POI)

$r_title(websquare.xml 설정 예)
<WebSquare>
        <excel>
            <upload>
                <decrypt value="com.inswave.Decrypt" tempDir="/TEMPDIR" />
                <dataConvertor value="com.inswave.CellConvertor" />
                <loadingMode value="" />
            </upload>
        </excel>
</WebSquare>

decrypt 구현

DRM과의 연계가 필요한 경우, DRM 암호화 해제 후 파일을 반환하는 클래스를 아래와 같이 구현하십시오.

  1. websquare.upload.handl.AbstractUploaDecrypter 를 상속받습니다.

  2. 리턴값이 Filedecrypt를 구현합니다.

$r_title(구현 예)
import java.io.File;
import websquare.upload.handl.AbstractUploaDecrypter;
import com.fasoo.adk.packager.WorkPackager;

public class ExcelUpDecripterWithFasoo  extends AbstractUploaDecrypter {
	/**
	 * @param <File:Y> file         : 클라이언트에서 선택한 파일명
	 * @desc 엑셀파일 -> WebSquare GridView 업로드시 복호화 연계
	 */
	public File decrypt(File file) throws Exception {
		// 1. 클라이언트에서 upload한 파일을 복호화 연계 처리를 구현 한다.(넘겨받는 file은 extractFilePath에 저장된다.)
		// 2. 복호화된 파일을 return 한다.
		String strFsdinitDir   = "/TMAX/wq/FSD/fsdinit";						// 설정파일경로
		String serverid        = "0123456789";				// 사이트 고유 코드
		String extractFilePath = "/TMAX/wq/tempUpload/excel/extractFilePath";	// 복호화파일경로
		// String packageFilePath = "/TMAX/wq/tempUpload/excel/packageFilePath";	// 암호화파일경로
		
		String fileName = file.getName();
		String packageFile = extractFilePath + File.separator + fileName;
		
		WorkPackager oWorkPackager = new WorkPackager();
		oWorkPackager.setOverWriteFlag(true);									// 덮어쓰기
		// oWorkPackager.setCharset("UTF-8");									// 케릭터셋 설정
		oWorkPackager.setCharset("eucKR");
		// oWorkPackager.setCharset("KSC5601");
		
		if (oWorkPackager.IsPackageFile(packageFile)) {
			
			boolean bret = oWorkPackager.DoExtract(strFsdinitDir, serverid, packageFile, packageFile);
			
			if (bret) {
				System.out.println("복호화 성공.[" + packageFile + "]");
				return new File(packageFile);
			} else {
				System.out.println("복호화 중 오류입니다.");
				System.out.println(" 오류 정보..");
				System.out.println(" [" + oWorkPackager.getLastErrorNum() + "] " + oWorkPackager.getLastErrorStr());
			}
		}
		return file;
	}
}

dataConverter 구현

셀 데이터의 가공이 필요한 경우 아래의 방법으로 dataConvertor를 구현하십시오.

  1. websquare.http.controller.grid.excel.write.ICellDataProvider를 상속받습니다.

  2. 리턴값이 StringconvertValue를 구현합니다.

다음은 셀 데이터가 tag를 포함한 경우 tag를 삭제하는 예제입니다.

$r_title(셀 데이터 가공 (tag 삭제))
import websquare.http.controller.grid.excel.write.ICellDataProvider;

/*
 * Excel Download시 tag내용을 삭제한다.
 * "계좌닉네임<a href=\"javascript:gibObj.grdView01_onheaderclick()\" class=\"btn_help\" title=\"도움말\">도움말</a>" => 계좌닉네임
 */
public class WebSquareExcelDataConverter implements ICellDataProvider {

	@Override
	public String convertValue(String cellValue) throws Exception {
		String value = cellValue.replaceAll("<(/)?([bB][rR])?(\\s\\S*)*(/)?>", "\n");
		//value = value.replaceAll("<(/)?([a-zA-Z]*)?(\\s\\S*)*(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");
		value = value.replaceAll("<[^>]*>", "");
		return value;
	}
}

위변조 방지1

관련 클래스

AbStractCellDataProvider: GridView에 엑셀 파일을 업로드할 때, 위변조 검증 로직이 참조할 수 있는 셀 정보(행/열 인덱스) 및 HTTP Servlet Request 정보를 제공.

구현 방법

AbStractCellDataProvider 클래스를 extend하여 convertValue 함수를 구현.

이후 관련 설정을 websquare.xml에 추가.

$r_title(AbstractCellDataProvider)
package websquare.http.controller.grid.excel.read;

import javax.servlet.http.HttpServletRequest;

public abstract class AbstractCellDataProvider {
	public abstract String convertValue( int rowIndex, int colIndex, 
	String cellvalue, HttpServletRequest request ) throws Exception;

}
$r_title(구현 예시)
package websquare.http.controller.grid.excel.read;

import javax.servlet.http.HttpServletRequest;

public class TEST extends AbstractCellDataProvider {
	public String convertValue(int rowIndex, int colIndex, String cellvalue, 
	HttpServletRequest request) throws Exception {

        return cellvalue;
    	}
}

websquare.xml에 아래 설정을 추가하십시오.

$r_title(websquare.xml)

<websquare>
    <excel>
        <upload>
            <cellDataConvertor value="구현팩키지명" />
        </upload>
    </excel>
</websquare>

GridView의 엑셀 파일 업로드/다운로드시 셀 데이터를 가공에 사용되는 ICellDataProvider는 현재의 셀의 값만 제공.

CSV

GridView 컴포넌트에 CSV 파일을 업로드할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래의 설정을 추가하십시오.

CSV 파일 업로드를 위한 websquare.xml 설정 항목

항목

설명

encoding

CSV 파일 일코딩 방법 (기본값: UTF-8)

useBOM

BOM 사용 여부 - true 혹은 false.

  • 인코딩 방법이 UTF-8인 경우, 한글이 정상 추력되지 않습니다. 이 경우 Editor 등을 통해 BOM 사용 여부를 확인한 후, 확인 결과를 본 항목에 설정하십시오.

decrypt

Excel/CSV 파일을 업로드 후 DRM 암호화 해제에 필요한 클래스의 전체 경로.

  • 암호화 해제 클래스는 websquare.upload.handl.AbstractUploaDecrypter를 상속받아 생성함.

(decrypt 구현 참조.)

maxUploadSize

업로드 가능한 최대 파일 크기를 지정. (단위: 바이트)

해당 크기를 초과할 경우 오류 메시지 출력.

브라우저가 files 속성을 지원하지 않을 경우 사용.

decrypt/@tempDir

DRM 암호화 해제를 위한 임시 폴더.

$r_title(websquare.xml 설정 예)
<WebSquare>
        <csv>
            <encoding value="UTF-8" />
            <useBOM value="true" />
			<upload>
                <decrypt value="com.inswave.Decrypt" tempDir="/TEMPDIR" />
                <maxUploadSize value="바이트수" />
            </upload>
        </csv>
</WebSquare>

최대 업로드 사이즈2

options.maxFileSize (gridView1.readCSV ( options ))

설명

업로드 가능한 최대 파일 크기를 지정. (단위: 바이트)

해당 크기를 초과할 경우 오류 메시지 출력.

비고

  • 브라우저가 files 속성을 지원할 경우에만 유효. (IE9 이상)

  • 브라우저가 files 속성을 지원하지 않을 경우, 아래 항목을 이용.

    • websquare.xml 파일의 <maxUploadSize>

$r_title(사용 예)
var option = {};
option.maxFileSize = "바이트수";
gridView1.readCSV( option );

Upload시 파일명 처리

중복 방지용 날짜 추가

$r_title(websquare.xml)
<websquare> 
	<upload> 
		<uploadMode value="random" /> 
		<baseDir value="D:\test\upload" /> 
		<folderName value="up" /> 
		<duplicatedFilePostFix value="yyyy-MM-dd(HHmmss)" /> 
		<firstFilePostFix value="true" /> 
	</upload> 
</websquare>

설정 설명

물리적으로 저장되는 경로는 baseDir / [subDir] / folderName 이 되며, uploadMode 에 따른 folderName 다음과 같습니다.

처리 방법

업로드 경로를 업무별로 분리하는 방법

websquare.xml이 아래와 같이 설정되어 있을 경우, subDir은 w2:upload 컴포넌트의 속성을 선택합니다.

<websquare> 
	<upload> 
		<baseDir value="D:\upload\"> 
			<subDir1 value="D:\uptest1\" /> 
			<subDir2 value="D:\uptest2\" /> 
		</baseDir> 
		<folderName value="up" /> 
	</upload> 
</websquare>

처리 방법

$r_title(업무 1)
<w2:upload type="image" style="position:absolute;vertical-align:middle;word-wrap:break- 
word;left:70px;top:100px;width:220px;height:50px;" imageStyle="position:absolute;vertical-align:middle; 
word-wrap:break-word" inputStyle="position:absolute;vertical-align:middle;word-wrap:break-word" 
id="upload1" subDir="subDir1">
$r_title(업무 2)
<w2:upload type="image" style="position:absolute;vertical-align:middle;word-wrap:break- 
word;left:70px;top:100px;width:220px;height:50px;" imageStyle="position:absolute;vertical-align:middle; 
word-wrap:break-word" inputStyle="position:absolute;vertical-align:middle;word-wrap:break-word" 
id="upload1" subDir="subDir2">

이 경우 업무1은 D:\uptest1\up\ 경로로 파일이 올라 가고, 업무2는 D:\uptest2\up\ 경로로 파일이 업로드 됩니다.

subDir속성에 값이 없는 경우에는 D:\upload\up\의 경로로 업로드 됩니다

사용자 정의 fileDefiner 설정

<websquare> 
	<upload> 
		… 
		<fileDefiner value="com.sample.CustomUploadFileDefiner" /> 
	</upload> 
</websquare>

처리 방법

package com.sample; 
 
import websquare.upload.handl.*; 
 
public class CustomUploadFileDefiner extends AbstractUploadFileDefiner { 
 
	public String getFileName( String clientFileName, String originalFileName ) throws Exception { 
		//파일명 변경 처리 
		return originalFileName; 
	} 
	public String getFilePath( String filePath ) throws Exception { 
		//파일경로 변경 처리 
		return filePath; 
	} 
}

업로드 이미지 파일명 (Editor)

editor 컴포넌트 사용시 이미지를 업로드하는 경우 참조하는 설정으로 Upload 설정과 동일합니다.

<websquare> 
	<upload> 
		… 
		<imgUpload> 
			<baseDir value="D:\uptest1\image" /> 
			<subDir1 value="D:\uptest1\image" /> 
			… 
			<imageDefiner value="com.sample.CustomImageUploadFileDefiner" /> 
		</imgUpload> 
		… 
	</upload> 
</websquare>

다운로드

$p.download (Excel 및 기타 파일)

WebSquare5는 $p.download(url경로) API를 제공합니다. 웹에서 Excel 파일을 다운로드하거나 모바일에서 Excel 파일을 보기를 위해 사용하며, Excel 파일 경로는 아래와 같이 context-root부터의 절대 경로로 지정해야 합니다.

$r_title(사용 예)
$p.download(“/download/sample/test.xls”)

Excel 이외의 파일을 다운로드하거나 URL로 접근할 수 없거나 혹은 추가 로직이 필요한 경우, 이를 JSP나 servlet으로 구현할 수 있습니다. 모바일은 Cordova가 plugin으로 제공하는 FileTransfer를 이용하십시오.

$r_title(스크립트 작성 예)
//url : file의 full 경로+file명, filename : 경로를 제외한 실제 파일의 이름(test.txt)
common.fileDownload = function(url, fileName) {
  if (typeof url =="undefined" || url == "") {
    alert("url is null");
    return;
  }
  if (typeof fileName == "undefined") {
    alert("filename is null");
    return;
  }
  
  var submitUrl = "";
  if (url.indexOf(".jsp") < 0) {
    submitUrl = "/common/jsp/fileDownload.jsp?fileUrl="+url+"&fileName="+fileName;
  } else {
    submitUrl = url;
  }
  if (WebSquare.hybridApp) {
    var fileTransfer = new FileTransfer();
    var filePath = "";
    if (WebSquare.core.browserCheck.iphone || WebSquare.core.browserCheck.ipad) {
      if (cordova.file.tempDirectory == null || cordova.file.tempDirectory == "") {
        filePath = cordova.file.dataDirectory+fileName;
      } else {
        filePath = cordova.file.tempDirectory+fileName;
      }
      console.log(filePath);
    } else {
      filePath = cordova.file.externalRootDirectory+fileName;
    }
    
    fileTransfer.download(gibLangObj.getServerUrl(url), filePath,
      function(entr) {
        console.log("filedownload success");
        if (WebSquare.core.browserCheck.iphone || WebSquare.core.browserCheck.ipad) {
          filePath = "cdvfile://localhost/temporary/"+filePath.substr(filePath.indexOf("/tmp")+5);
          window.open(filePath, "_blank", "");
        } else {
          window.open(filePath, "_system", "");
        }
      },
      function(error) {
          console.log("filedownload fail!!");
      }
    );
  } else {
    $p.download(submitUrl);
  }
};
$r_title(JSP 작성 예)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%  
	request.setCharacterEncoding("UTF-8");

	String fileUrl = request.getParameter("fileUrl");
	String fileName = request.getParameter("fileName");

	ServletContext context = pageContext.getServletContext();
	String applicationRoot = context.getRealPath("/");

	try {
		File file = new File(applicationRoot+"/"+fileUrl);
		if ( file.exists() ) {
			if ( fileName == null || "".equals(fileName) ) {
				fileName = file.getName();
			}
			response.reset();
			response.setContentType("application/octet-stream; charset=UTF-8;");
			response.setHeader("Content-Transfer-Encoding", "binary;");
			response.setHeader("Pragma", "no-cache;");
			response.setHeader("Expires", "-1;");

			String userAgent = request.getHeader("User-Agent");
			if ( userAgent.indexOf("MSIE 5.5") > -1 ) { // MS IE 5.5 이하
				fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+","%20");
			} else if ( userAgent.indexOf("MSIE") > -1) { // MS IE (보통은 6.x 이상 가정)
				fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+","%20");
			} else if ( userAgent.indexOf("Chrome") > -1) { // Chrome
				fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
			} else if ( userAgent.indexOf("Firefox") > -1) { // Firefox
				fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
			} else { // 모질라나 오페라
				fileName = new String(fileName.getBytes("UTF-8"), "latin1");
			}
			response.setHeader("Content-Disposition", "attachment;filename=\""+ fileName +"\"");
			response.setHeader("Content-Length", String.valueOf((int)file.length()) );

			FileInputStream fis = new FileInputStream(file.getAbsolutePath());
			ServletOutputStream sos = response.getOutputStream();

			out.clear();
			out = pageContext.pushBody();

			byte b[] = new byte[4096];
			int nRead = 0;
			while ((nRead = fis.read(b, 0, b.length)) != -1) {
				sos.write(b, 0, nRead);
			}
			sos.flush();
			sos.close();
			fis.close();
		} else {
			Logger.fine(">> File does not exist !! ["+ fileUrl +"]");
			response.reset();
			response.setContentType("text/html; charset=UTF-8;");
			response.setHeader("Content-Transfer-Encoding", "UTF-8");
			response.setHeader("Content-Disposition", "");
			out.print("<script>alert(\"file not found ["+fileUrl+"]\")</script>");
		}
	} catch(Exception e) {
		Logger.exception("[fileDownload.jsp] Exception.", e);
	} finally {
	}
%>

WebSquare.net.download

WebSquare.net.download( actionUrl , XML , sendMethod );를 통해 다운로드를 수행할 경우, 아래의 방법으로 JSP로 파라미터를 전달할 수 있습니다.

  1. 내부적으로 IFrame을 만들고 form-submit 하는 방식으로 서블릿을 호출합니다.

  2. 두번째 인자로 파라미터(string)를 전달할 수 있습니다.

  3. 해당 인자는 xmlValue의 값으로 전달되기 때문에 서블릿에서는 아래 형태로 패러미터값을 가져올 수 있습니다.

    String req = request.getParameter("xmlValue");

  4. 파러미터는 xmlValue의 값으로만 전달됩니다. 2개 이상의 정보를 전달할 경우에는 XML/JSON 형태 문자열로 전달합니다. 서버에서는 해당 문자열을 객체화하여 사용할 수 있습니다.

$r_title(사용 예)
...
<script type="text/javascript"><![CDATA[
var jsonData = [{"col1":"a", "col2":"b", "col3":"c", "col4":"d"},
	{"col1":"aa", "col2":"bb", "col3":"cc", "col4":"dd"},
	{"col1":"aaa", "col2":"bbb", "col3":"ccc", "col4":"ddd"},
	{"col1":"aaaa", "col2":"bbbb", "col3":"cccc", "col4":"dddd"},];
        
dataList1.setJSON( jsonData );

scwin.trigger1_onclick = function(e) {
	//debugger;
	// 데이터리스트를 json으로 반환 후 해당 내용을 인코딩
	
	var jsondata 
	= WebSquare.text.BASE64Encoder(JSON.stringify(dataList1.getAllJSON()));
	console.log(jsondata);
	WebSquare.net.download( "/JSP/FileDown.jsp" , jsondata , "post" );

	//var name = dataList1.getCellData( 0 , 0 );
	//WebSquare.text.BASE64Encoder(name);
	// XML 형태로 만들어 주는구조
	//var xmldata = "<data><name>"+ name +"</name></data>";
	// JSON 형태로 만들어 주는구조	};		
]]></script>
...
$r_title(사용 예(JSP))
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" 
    import=	"org.w3c.dom.*, java.net.*, websquare.util.*, 
			org.json.simple.*,org.json.simple.parser.*" %><%	
		request.setCharacterEncoding("UTF-8");
	String req = 
	URLDecoder.decode(HttpUtil.getBase64Parameter(request, "xmlValue"), "UTF-8");
		application.log(req);
		System.out.println(req);
  		JSONParser jsonParser = new JSONParser();
		
	//JSONParser를 이용해서 던진 문자열 반환 dataList일 경우에는 
	// [{},{},{}] 해당형태로 반환하기 때문에 JSONArray 형태로 받아야함.
	// 만약 dataMap을 사용한다면 JSONObject로 받아도 가능.
	// WebSquare는 WebSquare.text.BASE64Encoder로 전달해야함.

  	JSONArray jsonArray = (JSONArray)jsonParser.parse(req);
	
 	// JSONObject에서 원하는 데이터 뽑아오기.
   	for(int i = 0; i < jsonArray.size(); i++) {
 	 	JSONObject jsonObject = (JSONObject)jsonArray.get(i);
 	 	String col = (String)jsonObject.get("col1");
 		application.log(col);
 		System.out.println(col);
  	}
  	
  	// XML로 던지는 JSON 구조
	// jsp 상에서 xmlValue라는 노드를 붙여서 전달 받음
	// Document xmlValueDoc = XMLUtil.getDocument(URLDecoder.decode(HttpUtil.getParameter(request, "xmlValue"), "UTF-8"));
	// String name = XMLUtil.getText(xmlValueDoc, "name");
	// application.log(name);
%>

GridView

Excel

기본 설정

GridView 컴포넌트에서 Excel 파일을 다운로드할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래의 설정을 추가하십시오.

Excel 파일 다운로드를 위한 websquare.xml 설정 항목

항목

설명

encrypt

Excel 파일을 DRM으로 암호화 후 stream으로 write하는 클래스의 전체 경로.

  • websquare.download.handl.AbstractDownloadEncrypter 를 상속.

  • JDK 1.5 이상 DRM과 연계.

(encrypt 구현 참조.)

encrypt14

DRM 암호화된 파일을 다운로드하는 클래스의 전체 경로.

  • websquare.download.handl.AbstractDownloadEncrypter14 를 상속.

  • JDK 1.4 DRM과 연계.

userAgent

Excel 파일 다운로드 중 요청이 2번 발생하는 버그가 발생하는 일부 Android 장치에 agent의 패턴.

  • Android 4.0 기본브라우저와 AndroidDownloadManager 사용시 발생.

keyMode

모바일에서 Excel 파일 다운로드 request를 위한 ID 생성 규칙. (기본값은 없음.)

  • random을 지정하는 경우 ID는 "WEBSQUARE_EXCEL_INFO" + "request.getParameter("randomKey")로 생성.

keyMode@preFix

request ID는 기본적으로 "WEBSQUARE_EXCEL_INFO"로 생성되는데, 이를 변경할 경우 prefix에 지정.

definer

중복호출 시 Excel 파일 정보를 get/set하는 클래스의 전체 경로.

(기본적으로 중복호출 시 Excel 파일 정보를 참조하기 위해 세션에 request ID를 저장합니다. Excel 정보를 다른 곳으로부터 참조할 경우 이같은 클래스를 구현할 수 있습니다.)

  • 해당 클래스는 websquare.download.handl.AbstractExcelDownload를 상속

rowAccessWindowSize

POI 3.8부터 대량 Excel 파일 전송 기능이 추가되어, 대용량 그리드의 경우 그리드에 Excel 데이터를 쓴 후 메모리에 올라간 Excel 생성 정보를 flush 할 수 있습니다.

  • 기본값: 100 (100개의 행당 flush됨.)

  • 각 사이트의 특성에 따라 가감한 숫자를 지정.

$r_title(websquare.xml 설정 예)
<WebSquare>
        <excel>
            <download>
                <encrypt value="com.inswave.Encrypt"/>
<mobile>
	<keyMode value="" preFix="" />
	<definer value="" />
	<userAgent value="[\w\W]+Android[\w\W]+Version/4.0[\w\W]+|[\w\W]*AndroidDownloadManager[\w\W]*" />
</mobile>
</download>
        </excel>
</WebSquare>

encrypt 구현

DRM 암호화가 필요한 경우, DRM 암호화 클래스를 아래와 같이 구현하십시오.

  1. websquare.upload.handl.AbstractDownloadEncrypter 를 상속합니다.

  2. 파일을 암호화하여 stream에 file을 write 합니다.

$r_title(encrypt 구현 예)
import java.io.BufferedInputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import websquare.download.handl.AbstractDownloadEncrypter;

import com.fasoo.adk.packager.*;

public class ExcelDownEncripterWithFasoo extends AbstractDownloadEncrypter {
  /**
   * @param <BufferedInputStream:Y> is           : Excel Data
   * @param <HttpServletRequest:Y> request       : HttpServletRequest
   * @param <HttpServletResponse:Y> response     : HttpServletResponse
   * @desc WebSquare GridView -> 엑셀 다운로드시 암호화 연계. is을 암호화 하여 response에 write처리하도록 구현한다.
   */
  public void encrypt(BufferedInputStream is, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 1. 클라이언트에서 upload한 파일을 복호화 연계 처리를 구현 한다.
    // 2. 복호화된 파일을 return 한다.
    OutputStream outputStream   = null;
    InputStream inputStream     = null;
    FileOutputStream fos        = null;
    
    String excelFileName        = null;
    
    String strFsdinitDir        = "/TMAX/wq/FSD/fsdinit";           // 설정파일경로
    String serverid             = "0123456789";                 // 사이 고유 코드
    String extractFilePath      = "/TMAX/wq/tempUpload/excel/extractFilePath";  // 복호화파일경로
    String packageFilePath      = "/TMAX/wq/tempUpload/excel/packageFilePath";  // 암호화파일경로
    
    String oUserID              = "admin";
    String oUserName            = "관리자";
    String oWriterID            = "admin";
    String oWriterName          = "관리자";
    String oWriterDeptCode      = "COMPANY";
    String oWriterDeptName      = "사이트명";
    String oOwnerID             = "admin";
    String oOwnerName           = "관리자";
    String oOwnerDeptCode       = "COMPANY";
    String oOwnerDeptName       = "사이트명";
    String SecurityLevel        = "1";
    
    try {
      // 1. WebSquare excel 생성(is 를 직접 읽어 DRM솔루션 업체에서 직접 엑셀 생성이 가능하면 1.0 은 필요없다.)
      excelFileName = "tempExcel_" + System.currentTimeMillis() + ".xlsx";
      
      File file = new File(extractFilePath + File.separator + excelFileName);
      fos = new FileOutputStream(file);
      
      byte[] readBuff = new byte[4096];
      int readLen = -1;
      
      try {
        while ((readLen = is.read(readBuff)) != -1) {
          fos.write(readBuff, 0, readLen);
        }
      } finally {
        if (fos != null) {
          try {
            fos.flush();
            fos.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
      
      file.deleteOnExit();
      
      // 2. 1에서 생성한 엑셀 파일을 파수연계 암호화 처리
      WorkPackager oWorkPackager = new WorkPackager();
      
      boolean bret = oWorkPackager.DoPackagingFsn2(
            strFsdinitDir,                      // FSD 홈디렉토리
            serverid,                       // Server ID
            extractFilePath  + File.separator + excelFileName,    // 암호화를 하고자 하는 원본 파일
            packageFilePath  + File.separator + excelFileName,    // 암호화 후 생성 하고자 하는 파일
            excelFileName,                      // 원본 파일명
            oUserID,                        // 생성자(등록자) ID
            oUserName,                        // 생성자(등록자) 이름
            oWriterID,                        // 작성자 ID
            oWriterName,                      // 작성자 Name
            oWriterDeptCode,                    // 작성자 부서코드
            oWriterDeptName,                    // 작성자 부서명
            oOwnerID,                       // 소유자 ID
            oOwnerName,                       // 소유자 Name
            oOwnerDeptCode,                     // 소유자 부서코드
            oOwnerDeptName,                     // 소유자 부서명
            SecurityLevel                     // 보안등급
          );
      
      // 3. 다운로드 시작
      if (bret) {
        File encFile = new File(packageFilePath + File.separator + excelFileName);
        
        outputStream = response.getOutputStream();
        inputStream = new FileInputStream(encFile);

        byte[] writeBuff = new byte[4096];
        int writeLen = -1;
        
        response.setHeader("Content-Length", encFile.length() + "");

        while ((writeLen = inputStream.read(writeBuff)) != -1) {
          response.getOutputStream().write(writeBuff, 0, writeLen);
        }
        
        encFile.deleteOnExit();
      } else {
        System.out.println("암호화 중 오류입니다.");
        System.out.println("오류 정보..");
        System.out.println("["+ oWorkPackager.getLastErrorNum()+"] "+oWorkPackager.getLastErrorStr());
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (fos != null) {
        try {fos.close();} catch (Exception ex) {ex.printStackTrace();}
      }
      if (inputStream != null) {
        try {inputStream.close();} catch (IOException ei) {ei.printStackTrace();}
      }
      if (outputStream != null) {
        try {
          outputStream.flush();
          outputStream.close();
        } catch (IOException eio) {eio.printStackTrace();}
      }
    }
  }
}

CSV

GridView 컴포넌트에서 CSV 파일을 다운로드할 경우, WEBSQUARE_HOME config 폴더에 있는 websquare.xml 에 아래의 설정을 추가하십시오.

CSV 파일 다운로드를 위한 websquare.xml 설정 항목

항목

설명

encrypt

CSV 파일을 DRM으로 암호화 후 stream으로 write하는 클래스의 전체 경로.

  • websquare.download.handl.AbstractDownloadEncrypter 를 상속.

  • JDK 1.5 이상 DRM과 연계.

(encrypt 구현 참조.)

$r_title(websquare.xml 설정 예)
<WebSquare>
        <csv>
            <encoding value="UTF-8" />
            <useBOM value="true" />
<download>
                <encry value="com.inswave.Encrypt"/>
            </upload>
        </csv>
</WebSquare>

  1. 5.0_1.2596A.20170406.123456 버전부터 지원
  2. 5.0_1.2682A.20170626.101341 버전에서 추가됨