--- Websqure 기능으로 사용하기
1. websquare.xml 설정
<websquare>
<upload>
<baseDir value="C:/base">
<uploadDir value="C:/upload" />
</baseDir>
<encoding value="UTF-8" />
<fileDefiner value="project.util.WebsquareFileUploadDefiner" />
<duplicatedFilePostFix value="yyyy.MM.dd(HH mm ss.SSS)" />
<firstFilePostFix value="false" />
<maxUploadSize value="5000000" />
<uploadMode value="random" />
<folderName value="/" />
<allowedExtension>
gif, jpg, doc, xls, ppt, pdf, txt, xlsx, png, pptx, docx, jpeg, xml, cell, csv, der
</allowedExtension>
<deniedExtension>
jsp, asp, php
</deniedExtension>
。
。
。
</upload>
。
。
。
</websquare>
1. <baseDir> : [property : subDir]가 설정되어있지 않다면 baseDir의 value 위치로 파일을 업로드 한다.
2. <uploadDir> : [property : subDir]에 태그네임을 설정하면 태그네임의 value 위치로 파일을 업로드 한다.
3. <encoding> : 업로드 하는 파일의 파일명 인코딩을 설정.
4. <fileDefiner> : 파일명과 파일주소를 정의할 수 있는 인터페이스. 아래에 추가 서술.
5. <duplicatedFilePostFix> : 업로드 시 동일한 파일이 있을시, 파일명에 붙일 postFix.
<fileDefiner>로 유니크한 파일명으로 업로드된다면 사실상 쓰이지 않는다.
6. <firstFilePostFix> : 업로드시 최초 파일의 postfix를 붙일지 여부.
7. <maxUploadSize> : 업로드 하는 파일의 최대 크기를 설정. 기본단위는 1Mbyte.
8. <uploadMode> : value="session"이면 session의 <folderName> 설정값으로 폴더명 정의.(기본 설정)
value="random"이면 websquare.xml의 <folderName> 설정값으로 폴더명 정의.
9. <folderName> : 업로드할 폴더명.
10. <allowedExtension> : 업로드를 허용할 확장자.
11. <deniedExtension> : 업로드를 허용하지 않을 확장자.
2. fileDefiner 정의
//AbstractUploadFileDefiner를 반드시 상속받아야 하고
//getFileName과 getFilePath가 정의되어야 한다.
public class WebsquareFileUploadDefiner extends AbstractUploadFileDefiner {
/**
* @param String clientFileName : client에서 요청한 파일명
* String originalFileName : 현재 웹스퀘어가 변환한 파일명
* @return String : 변경된 파일명
* @desc 변경 대상 실제 파일명을 받아 파일명 변경 한다.
* getFileName을 구현 하여야 한다.
*/
public String getFileName( String clientFileName, String originalFileName ) throws Exception {
String returnFileName = "";
String ext = "";
int index = originalFileName.lastIndexOf(".");
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd.HHmmss.SSS");
String date = format.format(new Date());
String seq = Integer.toString(KeyGenerator.getIntKey()); // KeyGenerator.getIntKey() 는 멀티쓰레드 환경에서 안전하게 동기화 처리되며 호출시마다 일련번호가 1씩 증가한다. WAS재기동시에는 0으로 초기화된다
String uniKey = date + "_" + seq;
if(index > -1) {
ext = originalFileName.substring(index + 1);
returnFileName = originalFileName.substring(0, index) + "_" + uniKey + "." + ext;
} else {
returnFileName = originalFileName.substring(0) + "_" + uniKey;
}
return returnFileName;
}
/**
* @param String filePath : 현재 웹스퀘어가 정의한 서버 파일 경로
* @return String : 변경된 파일 경로
* @desc 현재 파일경로를 받아 파일경로를 재 설정 한다.
* getFilePath를 구현 하여야 한다.
*/
public String getFilePath( String filePath ) throws Exception {
return filePath;
}
}
--- 자체 컨트롤러로 사용하기
1. Controller 정의
@RequestMapping("/upload.do")
@ResponseBody
public void uploadController(HttpServletRequest req, HttpServletResponse res) throws Exception {
Map<String,Object> result = uploadService.upload(req);
StringBuilder stb = new StringBuilder();
stb.append("<script>window.onload = doInit;function doInit() {");
stb.append("parent.uploadCallback(\"<ret>");
stb.append("<key>"+result.get("key")+"</key>"); //파일 업로드 경로
stb.append("<storedFileList>"+result.get("file")+"</storedFileList>"); //서버에 저장된 파일명
stb.append("<localfileList>"+result.get("localFile")+"</localfileList>"); //본래 파일명
stb.append("<fileSizeList>"+result.get("size")+"</fileSizeList>"); //파일 사이즈
stb.append("<maxUploadSize></maxUploadSize>"); //업로드 최대 사이즈
stb.append("<deniedList></deniedList>"); //저장 실패한 파일명
stb.append("<deniedCodeList></deniedCodeList>"); //저장 실패 코드
stb.append("</ret>\");}</script>");
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(res);
wrapper.setContentType("text/html;charset=UTF-8");
wrapper.setHeader("Content-length", ""+stb.toString().getBytes().length);
res.getWriter().print(stb.toString());
}
[property : action]에 해당 컨트롤러의 URL을 지정한다.
위의 StringBuilder stb가 MultiUpload가 파일 업로드 후 반환하는 data의 형식이라서 변경해서는 안된다.
2. Service 정의
public Map<String, Object> upload(HttpServletRequest req) {
Map<String, Object> fileInfo = null;
//넘어온 데이터가 MultipartContent인지 확인
if (ServletFileUpload.isMultipartContent(req)) {
result = new HashMap<String, Object>();
File tempDir = new File("C:" + File.separator + "temp");
if (!tempDir.exists()) {
tempDir.mkdir();
}
File uploadDir = new File("C:" + File.separator + "upload");
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
//메모리에서 직접 처리할 파일 용량 선언(1MB)
factory.setSizeThreshold(1 * 1024 * 1024);
//메모리에서 직접 처리할 용량이 초과 할 경우, 메모리에 바이너리 데이터를 임시파일로 저장할 작업 디렉터리를 설정
factory.setRepository(tempDir);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(10 * 1024 * 1024);
try {
List<FileItem> items = upload.parseRequest(req);
File uploadedFile = null;
for (FileItem item : items) {
if (item.isFormField()) {;} //데이터가 form형식이면 true, 파일형식이면 false 리턴
else {
try {
uploadFile = File.createTempFile(DateUtil.getCurrentDay() + UUID.randomUUID() + "_", "." + FilenameUtils.getExtension(item.getName()), uploadDir);
uploadFile.deleteOnExit();
item.write(uploadFile);
fileInfo.put("deniedCode", "");
fileInfo.put("deniedFile", "");
fileInfo.put("file", uploadedFile.getName());
fileInfo.put("key", basePath + File.separator + "extract");
fileInfo.put("localFile", item.getName());
fileInfo.put("maxUploadSize", 10 * 1024 * 1024);
fileInfo.put("size", uploadedFile.length());
}catch (Exception e) {
uploadedFile.delete();
throw new RuntimeException(e);
}
item.delete();
}
}
}catch (FileUploadException e) {
throw Exception(e);
}
}
return fileInfo;
}