上传附件接口

下面是接口详情,分别有存储到数据库,存储到磁盘,存储到fastdfs,存储到其他位置

    @RequestMapping("upload")
    @ResponseBody
    public HashMap<String, Object> upload(
            MultipartFile file,
            HttpServletRequest request) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        String chunk = request.getParameter("chunk");//当前分片在上传分片中的顺序(从0开始)
        String chunks = request.getParameter("chunks");//总分片数
        String size = request.getParameter("size"); //文件大小(分片的是文件总大小)
        String fileId = "";
        String fileName = null;
        try {
            fileName = file.getOriginalFilename();
            InputStream fileInputStream = file.getInputStream();
            //分片上传
            if (chunks != null && !"".equals(chunks)) {
                saveTempDisk(guid, fileName, chunk, fileInputStream);
                String uploaderChunkKey = uploaderChunkKeyPre+guid+"_"+fileName;
                lock.lock();
                try{
                    int uploaderChunk  = 1;
                    String uploaderChunkStr = CacheHelper.getInstance().get(uploaderChunkKey);
                    if(null==uploaderChunkStr || "".equals(uploaderChunkStr)){
                        CacheHelper.getInstance().set(uploaderChunkKey, "1");
                    }else{
                        uploaderChunk = Integer.parseInt(uploaderChunkStr)+1;
                        CacheHelper.getInstance().set(uploaderChunkKey, uploaderChunk+"");
                    }
                    //最后一个分片组合
                    if (uploaderChunk == (Integer.parseInt(chunks))) {
                        //Thread.sleep(500);
                        fileId = fileMergeToSave(addTime, saveType, guid, fileName, size, chunk, chunks, formId, nodeId, tableName, secretLevel, category, markProcess, elementId,Boolean.parseBoolean(allowEncry),addDoc);
                        CacheHelper.getInstance().del(uploaderChunkKey);
                    }
                }finally{
                    lock.unlock();
                }

            } else {
                if (saveType != null && saveType.equals("DataBase")) {
                    fileId = saveToDatabase(addTime, fileInputStream, file.getOriginalFilename(),
                            file.getSize(), formId, nodeId, tableName, secretLevel, category, markProcess, elementId,Boolean.parseBoolean(allowEncry),addDoc);
                } else if (saveType != null && saveType.equals("Disk")) {
                    fileId = saveToDisk(addTime,fileInputStream, file.getOriginalFilename(),
                            file.getSize(), formId, nodeId, tableName, secretLevel, category, markProcess, elementId,Boolean.parseBoolean(allowEncry),addDoc);
                } else if (saveType != null && (saveType.equalsIgnoreCase("Fastdfs") ||saveType.equalsIgnoreCase("Fastfds"))) {
                    fileId = saveToFastfds(addTime, fileInputStream, file.getOriginalFilename(),
                            file.getSize(), formId, nodeId, tableName, secretLevel, category, markProcess, elementId,Boolean.parseBoolean(allowEncry),addDoc);
                } else {
                    fileId = saveToOther(addTime, fileInputStream, file.getOriginalFilename(),
                            file.getSize(), formId, nodeId, tableName, secretLevel, category, markProcess, elementId,addDoc);
                }
            }

            map.put("result", OpResult.success);
        } catch (Exception e) {
            if(e instanceof EOFException){
                map.put("result", OpResult.success);
            } else {
                map.put("result", OpResult.failure);
                log.error("upload上传附件错误:", e);
            }
        }
        map.put("fileId", fileId);

        return map;
    }

   /**
     * 分片上传到临时文件上
     *
     * @param guid     唯一标识
     * @param fileName 文件名称
     * @param chunk    分片序号,从0开始
     * @param in       输入流
     * @throws IOException
     */
    private void saveTempDisk(String guid, String fileName, String chunk, InputStream in)
            throws IOException {
        File uploadDir = new File(UploaderController.doccenterPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        String tempPath = FileUtil.getDoccenterDir(uploadDir.getAbsolutePath(), "temp", guid)
                + FileUtil.getSep() + fileName + chunk;
        OutputStream out = new FileOutputStream(new File(tempPath));
        try {
            Streams.copy(in, out, true);
        } finally {
            in.close();
            out.close();
        }
    }

 /**
     * 分片上传组合临时文件后保存
     *
     * @param saveType
     * @param guid
     * @param fileName
     * @param size
     * @param chunk
     * @param chunks
     * @param formId
     * @param nodeId
     * @param tableName
     * @param secretLevel
     * @param category
     * @param markProcess
     * @return
     * @throws Exception
     */
    private String fileMergeToSave(
            String addTime,
            String saveType,
            String guid,
            String fileName,
            String size,
            String chunk,
            String chunks,
            String formId,
            String nodeId,
            String tableName,
            String secretLevel,
            String category,
            String markProcess,
            String elementId,boolean _encry,
            String addDoc) throws Exception {

        String fileId = "";
        File uploadDir = new File(UploaderController.doccenterPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        try {
            long fileSize = Long.parseLong(size);

            Vector<InputStream> fileVector = new Vector<InputStream>();
            for (int i = 0; i < Integer.parseInt(chunks); i++) {
                String tempPath = FileUtil.getDoccenterDir(uploadDir.getAbsolutePath(), "temp", guid)
                        + FileUtil.getSep() + fileName + i;
                fileVector.add(new FileInputStream(new File(tempPath)));
            }
            Enumeration<InputStream> en = fileVector.elements();
            SequenceInputStream sis = new SequenceInputStream(en);

            if (saveType != null && saveType.equals("DataBase")) {
                fileId = saveToDatabase(addTime, sis, fileName,
                        fileSize, formId, nodeId, tableName, secretLevel, category, markProcess, elementId,_encry,addDoc);
            } else if (saveType != null && saveType.equals("Disk")) {
                fileId = saveToDisk(addTime, sis, fileName,
                        fileSize, formId, nodeId, tableName, secretLevel, category, markProcess, elementId,_encry,addDoc);
            } else if (saveType != null && saveType.equals("Fastdfs")) {
                fileId = saveToFastfds(addTime, sis, fileName,
                        fileSize, formId, nodeId, tableName, secretLevel, category, markProcess, elementId,_encry,addDoc);
            } else {
                fileId = saveToOther(addTime, sis, fileName,
                        fileSize, formId, nodeId, tableName, secretLevel, category, markProcess, elementId,addDoc);
            }
        } finally {

            //删除临时文件
            for (int i = 0; i < Integer.parseInt(chunks); i++) {
                String tempPath2 = FileUtil.getDoccenterDir(uploadDir.getAbsolutePath(), "temp", guid)
                        + FileUtil.getSep() + fileName + i;
                File tempFile = new File(tempPath2);
                if (tempFile.exists()) {
                    tempFile.delete();
                }
            }
            File tempFolder = FileUtil.getDoccenterDir(uploadDir.getAbsolutePath(), "temp", guid);
            if (tempFolder.exists()) {
                tempFolder.delete();
            }
        }
        return fileId;
    }

    /**
     * 存储到数据库
     *
     * @param in
     * @param fileName
     * @param fileSize
     * @param formId
     * @param nodeId
     * @param tableName
     * @param secretLevel
     * @param category
     * @param markProcess
     * @return
     */
    private String saveToDatabase(
            String addTime,
            InputStream in,
            String fileName,
            long fileSize,
            String formId,
            String nodeId,
            String tableName,
            String secretLevel,
            String category,
            String markProcess,
            String elementId,
            boolean _encry,
            String addDoc) throws Exception {

        String fileId = null;
        try {
            CommonHibernateDao2 hibernateDao = SpringFactory.getBean(CommonHibernateDao2.class);
            LobHelper lobHelper = hibernateDao.getSession().getLobHelper();
            if (in != null && fileName != null) {
                SysFileUpload sysFileUpload = new SysFileUpload();
                sysFileUpload.setId(ComUtil.getId());
                sysFileUpload.setFILE_NAME(fileName);
                sysFileUpload.setFILE_BUSINESS_ID(formId);
                sysFileUpload.setATTRIBUTE_01(nodeId);
                sysFileUpload.setFILE_BUSINESS_TABLE_NAME(tableName);
                sysFileUpload.setFILE_SIZE(fileSize);
                sysFileUpload.setFILE_TYPE(FileUtil.getFileExtensionName(fileName));
                sysFileUpload.setATTACH_CATEGORY(category);
                sysFileUpload.setSECRET_LEVEL(secretLevel);
                sysFileUpload.setElementId(elementId);
                sysFileUpload.setATTRIBUTE_03(addDoc);
                if (_encry) {
                    in = FileEncryptUtil.uploadAes128FileByStream(in, _FILE_ENCRY_KEY);
                }

                Blob fileBody;
                if ("sqlserver2008".equals(DbUtils.getDbType())) {
                    fileBody = NonContextualLobCreator.INSTANCE.createBlob(in, fileSize);
                } else {
                    fileBody = lobHelper.createBlob(in, fileSize);
                }
                sysFileUpload.setFILE_BODY(fileBody);

                if ("1".equals(markProcess)) {
                    sysFileUpload.setATTRIBUTE_02("1");
                }

                //手动设置上传时间为前台添加时间,用于排序
                sysFileUpload.setCreationDate(new Date(Long.valueOf(addTime)));
                sysFileUploadService.insertSysFileUpload(sysFileUpload);
                SwfUploadEvent swfUploadEvent = swfUploadService.getAfterEvent();
                if (swfUploadEvent != null) {
                    swfUploadEvent.afterSaveFileByDB(sysFileUpload);
                }
                fileId = sysFileUpload.getId();
            }
        } catch (Exception e) {
            log.error("saveToDatabase错误:", e);
            throw e;
        }
        return fileId;
    }

    /**
     * 存储到磁盘
     *
     * @param in
     * @param fileName
     * @param fileSize
     * @param formId
     * @param nodeId
     * @param tableName
     * @param secretLevel
     * @param category
     * @param markProcess
     * @return
     * @throws IOException
     */
    private String saveToDisk(
            String addTime,
            InputStream in,
            String fileName,
            long fileSize,
            String formId,
            String nodeId,
            String tableName,
            String secretLevel,
            String category,
            String markProcess,
            String elementId,
            boolean _encry,
            String addDoc) throws Exception {
        String fileId = null;

        File uploadDir;
        if (secretLevel.isEmpty()) {
            uploadDir = new File(UploaderController.doccenterPath);
        } else {
            uploadDir = new File(UploaderController.doccenterPath + FileUtil.getSep() + "SECRETLEVEL_" + secretLevel);
        }
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        String _encryFileName = fileName;
        if (in != null && fileName != null) {
            if (_encry) {
                in = FileEncryptUtil.uploadAes128FileByStream(in, _FILE_ENCRY_KEY);
                _encryFileName = FileEncryptUtil.uploadAes128FileByString(fileName,_FILE_ENCRY_KEY);
            }
            String filePath = FileUtil.getDoccenterDir(uploadDir.getAbsolutePath(),tableName, formId) + FileUtil.getSep() + _encryFileName;
            OutputStream out = new FileOutputStream(new File(filePath));
            try {
                Streams.copy(in, out, true);
            } finally {
                in.close();
                out.close();
            }

            SysFileUpload sysFileUpload = new SysFileUpload();
            sysFileUpload.setId(ComUtil.getId());
            sysFileUpload.setFILE_NAME(fileName);
            sysFileUpload.setFILE_BUSINESS_ID(formId);
            sysFileUpload.setATTRIBUTE_01(nodeId);
            sysFileUpload.setFILE_BUSINESS_TABLE_NAME(tableName);
            sysFileUpload.setFILE_SIZE(fileSize);
            sysFileUpload.setFILE_TYPE(FileUtil.getFileExtensionName(fileName));
            sysFileUpload.setFILE_URL(filePath);
            sysFileUpload.setATTACH_CATEGORY(category);
            sysFileUpload.setSECRET_LEVEL(secretLevel);
            sysFileUpload.setElementId(elementId);
            sysFileUpload.setATTRIBUTE_03(addDoc);
            if ("1".equals(markProcess)) {
                sysFileUpload.setATTRIBUTE_02("1");
            }

            //手动设置上传时间为前台添加时间,用于排序
            sysFileUpload.setCreationDate(new Date(Long.valueOf(addTime)));
            sysFileUploadService.insertSysFileUpload(sysFileUpload);
            SwfUploadEvent swfUploadEvent = swfUploadService.getAfterEvent();
            if (swfUploadEvent != null) {
                swfUploadEvent.afterSaveFileByDisk(sysFileUpload, in);
            }
            fileId = sysFileUpload.getId();
        }

        return fileId;
    }

    /**
     * 存储到Fastdfs
     *
     * @param in
     * @param fileName
     * @param fileSize
     * @param formId
     * @param nodeId
     * @param tableName
     * @param secretLevel
     * @param category
     * @param markProcess
     * @return
     * @throws Exception
     */
    private String saveToFastfds(
            String addTime,
            InputStream in,
            String fileName,
            long fileSize,
            String formId,
            String nodeId,
            String tableName,
            String secretLevel,
            String category,
            String markProcess,
            String elementId,
            boolean _encry,
            String addDoc) throws Exception {

        String fileId = null;
        if (in != null && fileName != null) {
            SysFileUpload sysFileUpload = new SysFileUpload();
            sysFileUpload.setId(ComUtil.getId());
            sysFileUpload.setFILE_NAME(fileName);
            sysFileUpload.setFILE_BUSINESS_ID(formId);
            sysFileUpload.setATTRIBUTE_01(nodeId);
            sysFileUpload.setFILE_BUSINESS_TABLE_NAME(tableName);
            sysFileUpload.setFILE_SIZE(fileSize);
            sysFileUpload.setFILE_TYPE(FileUtil.getFileExtensionName(fileName));
            sysFileUpload.setATTACH_CATEGORY(category);
            sysFileUpload.setSECRET_LEVEL(secretLevel);
            sysFileUpload.setElementId(elementId);
            sysFileUpload.setATTRIBUTE_03(addDoc);
            String res = null;
            if (_encry) {
                res = FastDfsUtil.uploadAes128FileByStream(in, fileName, FileUtil.getFileExtensionName(fileName), fileSize, _FILE_ENCRY_KEY);
            } else {
                res = FastDfsUtil.uploadFileByStream(in, fileName, FileUtil.getFileExtensionName(fileName), fileSize);
            }

            sysFileUpload.setFastfdsLocation(res);
            if ("1".equals(markProcess)) {
                sysFileUpload.setATTRIBUTE_02("1");
            }

            //手动设置上传时间为前台添加时间,用于排序
            sysFileUpload.setCreationDate(new Date(Long.valueOf(addTime)));

            sysFileUploadService.insertSysFileUpload(sysFileUpload);
            fileId = sysFileUpload.getId();
        }
        return fileId;
    }

    /**
     * 其他情况,其它,如mongdb
     *
     * @param in
     * @param fileName
     * @param fileSize
     * @param formId
     * @param nodeId
     * @param tableName
     * @param secretLevel
     * @param category
     * @param markProcess
     * @return
     */
    private String saveToOther(
            String addTime,
            InputStream in,
            String fileName,
            long fileSize,
            String formId,
            String nodeId,
            String tableName,
            String secretLevel,
            String category,
            String markProcess,
            String elementId,
            String addDoc) {

        String fileId = null;
        CommonHibernateDao2 hibernateDao = SpringFactory.getBean(CommonHibernateDao2.class);
        LobHelper lobHelper = hibernateDao.getSession().getLobHelper();
        if (in != null && fileName != null) {
            SysFileUpload sysFileUpload = new SysFileUpload();
            sysFileUpload.setId(ComUtil.getId());
            sysFileUpload.setFILE_NAME(fileName);
            sysFileUpload.setFILE_BUSINESS_ID(formId);
            sysFileUpload.setATTRIBUTE_01(nodeId);
            sysFileUpload.setFILE_BUSINESS_TABLE_NAME(tableName);
            sysFileUpload.setFILE_SIZE(fileSize);
            sysFileUpload.setFILE_TYPE(FileUtil.getFileExtensionName(fileName));
            sysFileUpload.setATTACH_CATEGORY(category);
            sysFileUpload.setSECRET_LEVEL(secretLevel);
            sysFileUpload.setElementId(elementId);
            sysFileUpload.setATTRIBUTE_03(addDoc);
            Blob fileBody = lobHelper.createBlob(in, fileSize);
            sysFileUpload.setFILE_BODY(fileBody);
            if ("1".equals(markProcess)) {
                sysFileUpload.setATTRIBUTE_02("1");
            }

            //手动设置上传时间为前台添加时间,用于排序
            sysFileUpload.setCreationDate(new Date(Long.valueOf(addTime)));

            sysFileUploadService.insertSysFileUpload(sysFileUpload);
            SwfUploadEvent swfUploadEvent = swfUploadService.getAfterEvent();
            if (swfUploadEvent != null) {
                swfUploadEvent.afterSaveFileByOther(sysFileUpload, in);
            }
            fileId = sysFileUpload.getId();
        }
        return fileId;

    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值