업로드
Upload/MultiUpload
기본 설정
Upload나 MultiUpload 컴포넌트를 이용하여 파일을 업로드할 경우, WEBSQUARE_HOME 의 config 폴더에 있는 websquare.xml 에 아래와 같은 설정을 추가하십시오.
항목 | 설명 |
---|---|
baseDir | 파일이 업로드되는 기본 경로.
|
subDir1 | baseDir의 하위 태그.
|
encoding | 업로드할 파일의 인코딩 방법 |
duplicatedFilePostFix | 동일한 이름의 파일이 존재할 경우 업로드 하는 파일에 추가할 postfix |
maxUploadSize | 업로드할 파일의 최대 크기 (단위: Byte) |
subSize1 | maxUploadSize 하위 태그.
|
deniedExtension | 업로드에서 제외할 파일의 확장자
|
allowedExtension | 업로드 가능한 파일의 확장자 |
uploadMode | 폴더 이름 생성 규칙 - session 혹은 random (기본값: session) session :
random:
|
folderName | 파일을 업로드할 폴더명. (uploadMode에서 참조.) |
fileDefiner | 파일 업로드 경로 및 파일 이름을 정의하는 사용자 정의 클래스의 전체 경로.
(fileDefiner 구현 참조.) |
decrypt | 파일을 업로드 후 DRM 암호화 해제애 필요한 클래스의 전체 경로.
(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 구현
파일 업로드 경로를 기본 설정으로 충족할 수 없는 경우, 아래의 방법으로 경로를 재정의하십시오.
websquare.upload.handl.AbstractUploadFileDefiner
를 상속받습니다.리턴값이
String
인getFileName
과getFilePath
를 구현합니다.
실제 생성되는 파일은 "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 암호화 해제 후 파일을 반환하는 클래스를 아래와 같이 구현하십시오.
websquare.upload.handl.AbstractUploaDecrypter
를 상속받습니다.리턴값이
File
인decrypt
를 구현합니다.
$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 에 아래와 같은 설정을 추가하십시오.
항목 | 설명 |
---|---|
baseDir | 파일이 업로드되는 기본 경로.
|
subDir | baseDir의 하위 태그.
|
deniedExtension | 업로드에서 제외할 파일의 확장자
|
allowedExtension | 업로드 가능한 파일의 확장자 |
imageDefiner |
|
$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 구현
이미지를 업로드 경로를 기본 설정으로 충족할 수 없는 경우, 아래의 방법으로 경로를 다시 정의하십시오.
websquare.upload.handl.AbstractUploadImageDefiner
를 상속받습니다.리턴값이
String
인getFileName
과getFilePath
를 구현합니다.
실제 생성되는 파일은 "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 에 아래의 설정을 추가하십시오.
항목 | 설명 |
---|---|
decrypt | Excel/CSV 파일을 업로드 후 DRM 암호화 해제에 필요한 클래스의 전체 경로.
(decrypt 구현 참조.) |
decrypt/@tempDir | DRM 암호화 해제를 위한 임시 폴더. |
dataConvertor | 각 셀의 데이터를 가공할 경우, 가공된 셀 데이터를 반환하는 클래스의 전체 경로.
(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 암호화 해제 후 파일을 반환하는 클래스를 아래와 같이 구현하십시오.
websquare.upload.handl.AbstractUploaDecrypter
를 상속받습니다.리턴값이
File
인decrypt
를 구현합니다.
$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를 구현하십시오.
websquare.http.controller.grid.excel.write.ICellDataProvider
를 상속받습니다.리턴값이
String
인convertValue
를 구현합니다.
다음은 셀 데이터가 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 에 아래의 설정을 추가하십시오.
항목 | 설명 |
---|---|
encoding | CSV 파일 일코딩 방법 (기본값: UTF-8) |
useBOM | BOM 사용 여부 - true 혹은 false.
|
decrypt | Excel/CSV 파일을 업로드 후 DRM 암호화 해제에 필요한 클래스의 전체 경로.
(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
설명 | 업로드 가능한 최대 파일 크기를 지정. (단위: 바이트) 해당 크기를 초과할 경우 오류 메시지 출력. |
비고 |
|
$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 다음과 같습니다.
uploadMode : session, random 값을 갖는다.
session : session에 folderName이라면 변수로 값이 존재 할 경우 해당 값으로 폴더명을 정의합니다. session에 folderName이 존재 하지 않을 경우, websquare.xml에서 folderName 설정값을 읽어 폴더명을 정의합니다. folderName 설정이 존재 하지 않은 경우는 random으로 폴더명을 정의합니다. ( ex) folderName_3939393939 )
random : websquare.xml에서 folderName 설정값을 읽어 폴더명을 정의합니다.
folderName 설정이 존재 하지 않은 경우는 random으로 폴더명을 정의합니다
( ex) folderName_3939393939 )
baseDir : 기본 업로드 폴더
baseDir의 하위노드 : baseDir의 하위에 폴더를 지정하려고 할 때 노드를 정의 하고 value값을 설정합니다.
업무적으로 업로드 폴더를 분리하는 경우 사용합니다.
하위디렉토리 정의 후 w2:upload 컴포넌트에 subDir Attribute를 정의합니다.
folderName : 업로드 되는 폴더명. uploadMode와 연계해서 사용 한다.
duplicatedFilePostFix : upload시 동일한 파일이 있을 경우 파일명 뒤에 붙여지는 prefix
firstFilePostFix : true인 경우 신규파일이라도 duplicatedFilePostFix를 붙입니다.
처리 방법
firstFilePostFix 설정값이 true인 경우 신규파일이라도 duplicatedFilePostFix를 붙입니다.
false이면 중복파일명이 없는 신규파일명은 원래 파일명을 따르고, 중복파일명이면 duplicatedFilePostFix값을 붙어 파일명을 정의합니다
업로드 경로를 업무별로 분리하는 방법
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>
fileDefiner : websquare 에서 제공하는 업로드 설정이 아닌 파일 경로와, 파일명을 재설정하는 사용자 정의
class (full-package)
처리 방법
AbstracUploadFileDefiner 을 상속 구현한다.
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로 파라미터를 전달할 수 있습니다.
내부적으로 IFrame을 만들고 form-submit 하는 방식으로 서블릿을 호출합니다.
두번째 인자로 파라미터(string)를 전달할 수 있습니다.
해당 인자는 xmlValue의 값으로 전달되기 때문에 서블릿에서는 아래 형태로 패러미터값을 가져올 수 있습니다.
String req = request.getParameter("xmlValue");
파러미터는 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 에 아래의 설정을 추가하십시오.
항목 | 설명 |
---|---|
encrypt | Excel 파일을 DRM으로 암호화 후 stream으로 write하는 클래스의 전체 경로.
(encrypt 구현 참조.) |
encrypt14 | DRM 암호화된 파일을 다운로드하는 클래스의 전체 경로.
|
userAgent | Excel 파일 다운로드 중 요청이 2번 발생하는 버그가 발생하는 일부 Android 장치에 agent의 패턴.
|
keyMode | 모바일에서 Excel 파일 다운로드 request를 위한 ID 생성 규칙. (기본값은 없음.)
|
keyMode@preFix | request ID는 기본적으로 " |
definer | 중복호출 시 Excel 파일 정보를 get/set하는 클래스의 전체 경로. (기본적으로 중복호출 시 Excel 파일 정보를 참조하기 위해 세션에 request ID를 저장합니다. Excel 정보를 다른 곳으로부터 참조할 경우 이같은 클래스를 구현할 수 있습니다.)
|
rowAccessWindowSize | POI 3.8부터 대량 Excel 파일 전송 기능이 추가되어, 대용량 그리드의 경우 그리드에 Excel 데이터를 쓴 후 메모리에 올라간 Excel 생성 정보를 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 암호화 클래스를 아래와 같이 구현하십시오.
websquare.upload.handl.AbstractDownloadEncrypter
를 상속합니다.파일을 암호화하여 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 에 아래의 설정을 추가하십시오.
항목 | 설명 |
---|---|
encrypt | CSV 파일을 DRM으로 암호화 후 stream으로 write하는 클래스의 전체 경로.
(encrypt 구현 참조.) |
$r_title(websquare.xml 설정 예) <WebSquare> <csv> <encoding value="UTF-8" /> <useBOM value="true" /> <download> <encry value="com.inswave.Encrypt"/> </upload> </csv> </WebSquare>
- 5.0_1.2596A.20170406.123456 버전부터 지원
- 5.0_1.2682A.20170626.101341 버전에서 추가됨