본문 바로가기

미역/웹스퀘어

MultiUpload 사용하기

--- 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;
}