Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    my fileupload custom datasource please help

    this is my custom datasource .
    this is work well on under 200Mb size
    but over 200MB my multifileItem progressbar stopping always near 256mb.

    I guess the reason is tomcat's permsize is bigger than upload file size
    than work well but smaller is stopped.
    because of memory full.

    how i do solve this problem?

    need help.

    I HAS ENTERPRICE LICENCE.

    =====================================

    package WDU.CMM.CMMN;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;

    import java.net.URLDecoder;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.Path;

    import javax.annotation.Resource;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.RequestContext;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.ModelAndView;

    import egovframework.ext.wdu.Constants;
    import egovframework.ext.wdu.dao.CommonDAO;
    import egovframework.ext.wdu.service.CommonService;
    import egovframework.ext.wdu.utils.ParamUtil;

    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.isomorphic.datasource.BasicDataSource;
    import com.isomorphic.datasource.DSRequest;
    import com.isomorphic.datasource.DSResponse;
    import com.isomorphic.servlet.ISCFileItem;


    @Controller
    @RequestMapping(value="/CMM_CMMN_FILE.do")

    public class CMM_CMMN_FILE extends BasicDataSource {
    private Log log = LogFactory.getLog(this.getClass());

    /** 공통 일반 서비스 */
    @Resource(name = "commonService")
    private CommonService commonService;

    /** 공통 일반 데이타베이스 액세스 객체 */
    @Resource(name = "commonDAO")
    private CommonDAO commonDao = new CommonDAO();

    private static SqlMapClient sqlMap ;

    private static final String FILE_SEPARATOR = System.getProperty("file.separator");
    private static final String PARAM_SYS_CD = "SYS_CD";
    private static final String PARAM_PARNTS_TABLE_NM = "PARNTS_TABLE_NM";
    private static final String PARAM_UPLOAD_ID = "UPLOAD_ID";


    @Override
    public DSResponse executeFetch (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);
    try {


    log.debug("executeFetch");

    log.debug(dsRequest.getCriteria());
    log.debug(dsRequest.getValues());
    Map fileMap = dsRequest.getValues();


    if(!fileMap.containsKey(PARAM_UPLOAD_ID)){
    log.debug("not contaions");
    return dsResponse.setData(new ArrayList());
    }
    else if(fileMap.get(PARAM_UPLOAD_ID).toString().split("_").length == 2){
    log.debug("not entity");
    return dsResponse.setData(new ArrayList());
    }

    HashMap<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.put(PARAM_UPLOAD_ID, fileMap.get(PARAM_UPLOAD_ID).toString());
    paramMap.put(PARAM_PARNTS_TABLE_NM, fileMap.get(PARAM_PARNTS_TABLE_NM).toString());
    paramMap.put(PARAM_SYS_CD, fileMap.get(PARAM_SYS_CD).toString());






    List result = (List)commonDao.selectMultiData("CMM_CMMN_FILE_UPDOWN.selectFileUploadData", paramMap);


    Map record = new HashMap();
    Iterator iterator = result.iterator();

    while(iterator.hasNext()){
    record = (Map)iterator.next();
    record.put("id", record.get("FILE_ID").toString());
    //URLDecoder.decode(record.get("REAL_FILE_NM").toString(), "UTF-8");
    record.put("file_filename", record.get("REAL_FILE_NM").toString());
    //record.put("file_filename", URLDecoder.decode(record.get("REAL_FILE_NM").toString(), "UTF-8"));
    record.put("file_filesize", record.get("FILE_SIZE").toString());


    }
    dsResponse.setData(result);
    } catch ( Exception e )
    {
    e.printStackTrace();

    } finally {

    }


    return dsResponse;
    }

    @Override
    public DSResponse execute (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);

    ServletContext conext = dsRequest.getServletContext();
    WebApplicationContext wContext = WebApplicationContextUtils.getWebApplicationContext(conext);
    sqlMap = (SqlMapClient)wContext.getBean("sqlMapClient");
    commonDao.setSqlMapClient(sqlMap);

    String operationType = dsRequest.getOperationType();

    if (this.log.isDebugEnabled()) {
    this.log.debug("===============FILE WORK START==================");
    this.log.debug(operationType);


    }
    if(operationType.equals("viewFile")){

    dsResponse = this.executeDownloadFile(dsRequest);
    }
    else if(operationType.equals("downloadFile")){

    dsResponse = this.executeDownloadFile(dsRequest);
    }
    else if(operationType.equals("fetch")){

    dsResponse = this.executeFetch(dsRequest);

    }
    else if(operationType.equals("add")){

    dsResponse = this.executeAdd(dsRequest);
    }
    else if(operationType.equals("update")){

    }
    else if(operationType.equals("remove")){

    dsResponse = this.executeRemove(dsRequest);
    }

    if (this.log.isDebugEnabled()) {
    this.log.debug("===============FILE WORK END==================");

    }

    return dsResponse;
    }

    @Override
    public DSResponse executeAdd (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);
    /*
    DiskFileItemFactory factory;
    ServletFileUpload upload;
    List<FileItem> list;
    */
    boolean isMultipart = ServletFileUpload.isMultipartContent(dsRequest.getHttpServletRequest());
    log.debug("isMultipart : " + isMultipart);

    Map fileMap = dsRequest.getValues();
    log.debug(fileMap);
    log.debug(dsRequest.getCriteria());
    log.debug(dsRequest.getClientSuppliedValues());
    ISCFileItem fileItem = dsRequest.getUploadedFile("file");


    if(fileMap.get(CMM_CMMN_FILE.PARAM_UPLOAD_ID).equals(null)){
    log.debug("++++++++++++++++++++++++++");
    log.debug("uploadId가 없습니다.");
    log.debug("++++++++++++++++++++++++++");
    }



    HashMap<String, Object> paramMap = new HashMap<String, Object>();
    HashMap<String, Object> resultMap;

    SimpleDateFormat format;

    String streFileName = "";
    String realFileName = "";
    String fileExt = "";

    String uploadRootPath = "";
    String uploadChildPath = "";

    try {
    /*
    //1. Create a factory for disk-based file items
    factory = new DiskFileItemFactory();

    // Set factory constraints
    //1메가가 넘지 않으면 메모리에서 바로 사용
    factory.setSizeThreshold(1024 * 1024 * 1);
    //factory.setRepository(new File(getServletContext().getRealPath("/WEB-INF/uploadData")));

    //1메가 이상이면 임시 temporaryDir 경로 폴더로 이동
    factory.setRepository(new File(dsRequest.getServletContext().getRealPath("/TempData")));

    // Create a new file upload handler
    upload = new ServletFileUpload(factory);

    // Set overall request size constraint
    // 파일 업로드 최대 size : 무한
    upload.setSizeMax(-1);
    //실제 업로드 부분(이부분에서 파일이 생성된다)

    //list = upload.parseRequest(dsRequest.getHttpServletRequest());
    */
    if (this.log.isDebugEnabled()) {
    //this.log.debug("File list.size : " + list.size());

    }






    paramMap.put(PARAM_UPLOAD_ID, fileMap.get(PARAM_UPLOAD_ID).toString());
    paramMap.put(PARAM_PARNTS_TABLE_NM, fileMap.get(PARAM_PARNTS_TABLE_NM).toString());
    paramMap.put(PARAM_SYS_CD, fileMap.get(PARAM_SYS_CD).toString());

    resultMap = (HashMap<String, Object>) commonDao.selectSingleData("CMM_CMMN_FILE_UPDOWN.selectSysFileStorgeMInfo", paramMap);
    //for(FileItem fileItem : list){
    //log.debug("file list 개수:"+list.size());
    format = new SimpleDateFormat("yyyyMMdd");
    uploadRootPath = (String)resultMap.get("STORGE_ROOT_PATH");
    uploadChildPath = FILE_SEPARATOR
    + paramMap.get("PARNTS_TABLE_NM")
    + FILE_SEPARATOR
    + format.format(new Date())
    + FILE_SEPARATOR
    + paramMap.get(PARAM_UPLOAD_ID)
    + FILE_SEPARATOR;

    realFileName = fileMap.get("file_filename").toString();
    fileExt = realFileName.substring((realFileName.lastIndexOf('.') + 1), realFileName.length());

    Long nanoVal = new Long(System.nanoTime());
    streFileName = nanoVal.toString() + "." + fileExt;


    if (this.log.isDebugEnabled()) {
    this.log.debug("File : " + uploadChildPath + uploadChildPath + realFileName);
    this.log.debug("File Name : " + realFileName);
    this.log.debug("File Ext : " + fileExt);
    this.log.debug("Storage File : " + streFileName);
    }

    File uploadFile = new File(uploadRootPath + uploadChildPath + streFileName);
    File uploadDir = uploadFile.getParentFile();

    if (!uploadDir.isFile() && !uploadDir.isDirectory()) {
    uploadDir.mkdirs();
    }

    if (this.log.isDebugEnabled()) {
    this.log.debug("1");
    }

    if (fileItem.getSize() > 0) {
    this.log.debug("파일사이즈:"+fileItem.getSize());
    }

    fileItem.write(uploadFile);

    /*
    FileOutputStream fout= new FileOutputStream (uploadFile);
    BufferedOutputStream bout= new BufferedOutputStream (fout);
    BufferedInputStream bin= new BufferedInputStream(fileItem.getInputStream());
    byte buf[] = new byte[2048];
    while ((bin.read(buf)) != -1)
    {
    bout.write(buf);
    }
    bout.close();
    bin.close();
    */


    if (this.log.isDebugEnabled()) {
    this.log.debug("2");
    }

    dsRequest.getHttpServletRequest().getSession();
    HttpSession session = dsRequest.getHttpServletRequest().getSession(true);
    String userId = (String)session.getAttribute("USER_ID");
    String userIp = dsRequest.getHttpServletRequest().getRemoteAddr();

    paramMap.put("PARNTS_TABLE_NM", resultMap.get("PARNTS_TABLE_NM"));
    paramMap.put("REAL_FILE_NM", realFileName);
    paramMap.put("STRE_FILE_NM", streFileName);
    paramMap.put("FILE_SIZE", fileItem.getSize());
    paramMap.put("FILE_STRE_PATH", uploadChildPath);
    paramMap.put("INP_ID", userId);
    paramMap.put("INP_IP", userIp);

    Object file_id = commonDao.insertData("CMM_CMMN_FILE_UPDOWN.insertFileUploadData", paramMap);
    if (this.log.isDebugEnabled()) {
    this.log.debug("3");
    }
    Map addedValue = dsRequest.getValues();
    addedValue.put("id",file_id);
    addedValue.remove("file");
    addedValue.put("file_date_created",new Date());
    dsResponse.setData(addedValue);
    if (this.log.isDebugEnabled()) {
    this.log.debug("4");
    }

    //}

    } catch ( Exception e )
    {
    e.printStackTrace();

    } finally {

    }

    return dsResponse;
    }

    @Override
    public DSResponse executeUpdate (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);


    return dsResponse;
    }

    @Override
    public DSResponse executeRemove (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);

    HashMap<String, Object> paramMap = (HashMap<String, Object>)dsRequest.getClientSuppliedValues();
    paramMap.put("FILE_ID", paramMap.get("id").toString());
    try {

    commonDao.deleteData("CMM_CMMN_FILE_UPDOWN.deleteFileUploadData", paramMap);

    dsResponse.setData(paramMap);

    }
    catch ( Exception e )
    {
    e.printStackTrace();

    } finally {

    }

    return dsResponse;
    }


    public DSResponse executeDownloadFile (DSRequest dsRequest) throws Exception {
    DSResponse dsResponse = new DSResponse(this);

    Map criteriaMap = dsRequest.getCriteria();
    HashMap<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.put("FILE_ID", criteriaMap.get("id").toString());
    byte[] bytes = null;
    String downloadRootPath = "";
    String downloadChildPath = "";
    String downloadFileName = "";

    try {

    HashMap<String, Object> detailMap =
    (HashMap<String, Object>)commonDao.selectSingleData("CMM_CMMN_FILE_UPDOWN.selectDownloadFileUploadData", paramMap);

    String PARNTS_TABLE_NM = detailMap.get("FILE_STRE_PATH").toString().replace(FILE_SEPARATOR,"@@");
    PARNTS_TABLE_NM = PARNTS_TABLE_NM.split("@@")[1];
    detailMap.put("PARNTS_TABLE_NM",PARNTS_TABLE_NM);
    HashMap<String, Object> mMap =
    (HashMap<String, Object>)commonDao.selectSingleData("CMM_CMMN_FILE_UPDOWN.selectSysFileStorgeMInfo", detailMap);

    downloadRootPath = (String)mMap.get("STORGE_ROOT_PATH");
    downloadFileName = (String)detailMap.get("STRE_FILE_NM");
    downloadChildPath = (String)detailMap.get("FILE_STRE_PATH");

    // 다운로드 카운트를 증가시킴
    commonDao.update("CMM_CMMN_FILE_UPDOWN.updateDownloadCount", detailMap);

    //java 7에서 등장한 기능을 사용함.
    Path path = Paths.get(downloadRootPath + downloadChildPath + downloadFileName);
    bytes = Files.readAllBytes(path);

    criteriaMap.put("file",bytes);
    //criteriaMap.put("download_filename","xxxxxxxxxxxxxxxxx");
    criteriaMap.put("file_filesize", bytes == null ? 0 : bytes.length);
    log.debug(criteriaMap);
    dsResponse.setData(criteriaMap);


    }
    catch ( Exception e )
    {
    e.printStackTrace();

    } finally {

    }

    return dsResponse;
    }

    /**
    * 파일 그룹의 정보를 가져온다.
    * @param json
    * @param model
    * @return
    * @throws Exception
    */
    @RequestMapping(params = "method=getTableSpec")
    public ModelAndView getTableSpec(HttpServletRequest request, HttpServletResponse response, @RequestBody String param)
    throws Exception{

    final HashMap<String, Object> ParamMap = (HashMap<String, Object>)ParamUtil.toMap(param);

    ModelAndView mav = new ModelAndView("jsonMapView");
    Map<String, Object> result = new HashMap<String, Object>();
    try
    {
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    // 비지니스 로직 시작
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++

    HashMap<String, Object> resultMap
    = (HashMap<String, Object>)commonDao.selectSingleData("CMM_CMMN_FILE_UPDOWN.selectSysFileStorgeMInfo",ParamMap);

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    // 비지니스 로직 종료
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++

    mav.addObject("result",resultMap);
    mav.addObject(Constants.ERROR_CODE, Constants.ERROR_NORAML);
    mav.addObject(Constants.ERROR_MSG, "");
    } catch ( Exception e )
    {
    e.printStackTrace();
    mav.addObject(Constants.ERROR_CODE, Constants.ERROR_EXCEPTION);
    mav.addObject(Constants.ERROR_MSG, e.toString());
    } finally {

    }
    return mav;

    }
    }
Working...
X