mirror of https://gitee.com/stylefeng/roses
				
				
				
			【7.2.5】【file】整理文件上传的内容
							parent
							
								
									049062e5a0
								
							
						
					
					
						commit
						624ba3c15c
					
				| 
						 | 
				
			
			@ -33,17 +33,13 @@ import cn.hutool.extra.spring.SpringUtil;
 | 
			
		|||
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.enums.FileLocationEnum;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.enums.FileStatusEnum;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.exception.FileException;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.exception.enums.FileExceptionEnum;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.expander.FileConfigExpander;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.api.pojo.request.SysFileInfoRequest;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileInfo;
 | 
			
		||||
import cn.stylefeng.roses.kernel.file.modular.service.SysFileStorageService;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
import static cn.stylefeng.roses.kernel.file.api.constants.FileConstants.FILE_POSTFIX_SEPARATOR;
 | 
			
		||||
| 
						 | 
				
			
			@ -57,76 +53,70 @@ import static cn.stylefeng.roses.kernel.file.api.constants.FileConstants.FILE_PO
 | 
			
		|||
public class FileInfoFactory {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 封装附件信息
 | 
			
		||||
     * 创建文件信息
 | 
			
		||||
     *
 | 
			
		||||
     * @author majianguo
 | 
			
		||||
     * @date 2020/12/27 12:55
 | 
			
		||||
     * @author fengshuonan
 | 
			
		||||
     * @date 2022/10/19 20:19
 | 
			
		||||
     */
 | 
			
		||||
    public static SysFileInfo createSysFileInfo(MultipartFile file, SysFileInfoRequest sysFileInfoRequest) {
 | 
			
		||||
 | 
			
		||||
        FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class);
 | 
			
		||||
        SysFileStorageService fileStorageService = SpringUtil.getBean(SysFileStorageService.class);
 | 
			
		||||
        // 封装存储文件信息(上传替换公共信息)
 | 
			
		||||
        SysFileInfo sysFileInfo = new SysFileInfo();
 | 
			
		||||
 | 
			
		||||
        // 生成文件的唯一id
 | 
			
		||||
        Long fileId = IdWorker.getId();
 | 
			
		||||
        sysFileInfo.setFileId(fileId);
 | 
			
		||||
 | 
			
		||||
        // 文件编码生成
 | 
			
		||||
        sysFileInfo.setFileCode(IdWorker.getId());
 | 
			
		||||
 | 
			
		||||
        // 默认版本号从1开始
 | 
			
		||||
        sysFileInfo.setFileVersion(1);
 | 
			
		||||
 | 
			
		||||
        // 文件状态
 | 
			
		||||
        sysFileInfo.setFileStatus(FileStatusEnum.NEW.getCode());
 | 
			
		||||
 | 
			
		||||
        // 如果是存在数据库库里,单独处理一下,如果不是存储到库里,则读取当前fileApi的存储位置
 | 
			
		||||
        if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
 | 
			
		||||
            sysFileInfo.setFileLocation(FileLocationEnum.DB.getCode());
 | 
			
		||||
        } else {
 | 
			
		||||
            FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class);
 | 
			
		||||
            sysFileInfo.setFileLocation(fileOperatorApi.getFileLocationEnum().getCode());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 桶名
 | 
			
		||||
        String fileBucket = FileConfigExpander.getDefaultBucket();
 | 
			
		||||
        if (StrUtil.isNotEmpty(sysFileInfoRequest.getFileBucket())) {
 | 
			
		||||
            fileBucket = sysFileInfoRequest.getFileBucket();
 | 
			
		||||
        }
 | 
			
		||||
        sysFileInfo.setFileBucket(fileBucket);
 | 
			
		||||
 | 
			
		||||
        // 获取文件原始名称
 | 
			
		||||
        String originalFilename = file.getOriginalFilename();
 | 
			
		||||
        sysFileInfo.setFileOriginName(originalFilename);
 | 
			
		||||
 | 
			
		||||
        // 获取文件后缀(不包含点)
 | 
			
		||||
        String fileSuffix = null;
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(originalFilename)) {
 | 
			
		||||
            fileSuffix = StrUtil.subAfter(originalFilename, FILE_POSTFIX_SEPARATOR, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 生成文件的最终名称
 | 
			
		||||
        String finalFileName = fileId + FILE_POSTFIX_SEPARATOR + fileSuffix;
 | 
			
		||||
 | 
			
		||||
        // 桶名
 | 
			
		||||
        String fileBucket = FileConfigExpander.getDefaultBucket();
 | 
			
		||||
 | 
			
		||||
        // 存储文件
 | 
			
		||||
        byte[] bytes;
 | 
			
		||||
        try {
 | 
			
		||||
            bytes = file.getBytes();
 | 
			
		||||
            if (StrUtil.isNotEmpty(sysFileInfoRequest.getFileBucket())) {
 | 
			
		||||
                fileBucket = sysFileInfoRequest.getFileBucket();
 | 
			
		||||
            }
 | 
			
		||||
            // 如果是存在数据库库里,单独处理一下
 | 
			
		||||
            if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
 | 
			
		||||
                fileStorageService.saveFile(fileId, bytes);
 | 
			
		||||
            } else {
 | 
			
		||||
                fileOperatorApi.storageFile(fileBucket, finalFileName, bytes);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            throw new FileException(FileExceptionEnum.ERROR_FILE, e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        sysFileInfo.setFileSuffix(fileSuffix);
 | 
			
		||||
 | 
			
		||||
        // 计算文件大小kb
 | 
			
		||||
        long fileSizeKb = Convert.toLong(NumberUtil.div(new BigDecimal(file.getSize()), BigDecimal.valueOf(1024)).setScale(0, BigDecimal.ROUND_HALF_UP));
 | 
			
		||||
        sysFileInfo.setFileSizeKb(fileSizeKb);
 | 
			
		||||
 | 
			
		||||
        // 计算文件大小信息
 | 
			
		||||
        String fileSizeInfo = FileUtil.readableFileSize(file.getSize());
 | 
			
		||||
 | 
			
		||||
        // 封装存储文件信息(上传替换公共信息)
 | 
			
		||||
        SysFileInfo sysFileInfo = new SysFileInfo();
 | 
			
		||||
        sysFileInfo.setFileId(fileId);
 | 
			
		||||
        // 如果是存在数据库库里,单独处理一下
 | 
			
		||||
        if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
 | 
			
		||||
            sysFileInfo.setFileLocation(FileLocationEnum.DB.getCode());
 | 
			
		||||
        } else {
 | 
			
		||||
            sysFileInfo.setFileLocation(fileOperatorApi.getFileLocationEnum().getCode());
 | 
			
		||||
        }
 | 
			
		||||
        sysFileInfo.setFileBucket(fileBucket);
 | 
			
		||||
        sysFileInfo.setFileObjectName(finalFileName);
 | 
			
		||||
        sysFileInfo.setFileOriginName(originalFilename);
 | 
			
		||||
        sysFileInfo.setFileSuffix(fileSuffix);
 | 
			
		||||
        sysFileInfo.setFileSizeKb(fileSizeKb);
 | 
			
		||||
        sysFileInfo.setFileSizeInfo(fileSizeInfo);
 | 
			
		||||
        sysFileInfo.setFileStatus(FileStatusEnum.NEW.getCode());
 | 
			
		||||
 | 
			
		||||
        // 生成文件的最终名称,存储在storage的名称
 | 
			
		||||
        String finalFileName = fileId + FILE_POSTFIX_SEPARATOR + fileSuffix;
 | 
			
		||||
        sysFileInfo.setFileObjectName(finalFileName);
 | 
			
		||||
 | 
			
		||||
        // 文件密级
 | 
			
		||||
        sysFileInfo.setSecretFlag(sysFileInfoRequest.getSecretFlag());
 | 
			
		||||
 | 
			
		||||
        // 返回结果
 | 
			
		||||
        return sysFileInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -154,10 +144,10 @@ public class FileInfoFactory {
 | 
			
		|||
        sysFileInfo.setFileStatus(FileStatusEnum.NEW.getCode());
 | 
			
		||||
 | 
			
		||||
        // 如果是存在数据库库里,单独处理一下,如果不是存储到库里,则读取当前fileApi的存储位置
 | 
			
		||||
        FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class);
 | 
			
		||||
        if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
 | 
			
		||||
            sysFileInfo.setFileLocation(FileLocationEnum.DB.getCode());
 | 
			
		||||
        } else {
 | 
			
		||||
            FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class);
 | 
			
		||||
            sysFileInfo.setFileLocation(fileOperatorApi.getFileLocationEnum().getCode());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -166,6 +156,7 @@ public class FileInfoFactory {
 | 
			
		|||
        if (StrUtil.isNotEmpty(sysFileInfoRequest.getFileBucket())) {
 | 
			
		||||
            fileBucket = sysFileInfoRequest.getFileBucket();
 | 
			
		||||
        }
 | 
			
		||||
        sysFileInfo.setFileBucket(fileBucket);
 | 
			
		||||
 | 
			
		||||
        // 原始文件名称
 | 
			
		||||
        sysFileInfo.setFileOriginName(file.getName());
 | 
			
		||||
| 
						 | 
				
			
			@ -175,6 +166,7 @@ public class FileInfoFactory {
 | 
			
		|||
        if (ObjectUtil.isNotEmpty(sysFileInfo.getFileOriginName())) {
 | 
			
		||||
            fileSuffix = StrUtil.subAfter(sysFileInfo.getFileOriginName(), FILE_POSTFIX_SEPARATOR, true);
 | 
			
		||||
        }
 | 
			
		||||
        sysFileInfo.setFileSuffix(fileSuffix);
 | 
			
		||||
 | 
			
		||||
        // 文件大小 kb
 | 
			
		||||
        long fileSizeKb = Convert.toLong(NumberUtil.div(new BigDecimal(file.length()), BigDecimal.valueOf(1024)).setScale(0, BigDecimal.ROUND_HALF_UP));
 | 
			
		||||
| 
						 | 
				
			
			@ -188,9 +180,6 @@ public class FileInfoFactory {
 | 
			
		|||
        String finalFileName = sysFileInfo.getFileId() + FILE_POSTFIX_SEPARATOR + fileSuffix;
 | 
			
		||||
        sysFileInfo.setFileObjectName(finalFileName);
 | 
			
		||||
 | 
			
		||||
        // 存储的路径
 | 
			
		||||
        sysFileInfo.setFilePath(null);
 | 
			
		||||
 | 
			
		||||
        // 是否是机密文件
 | 
			
		||||
        sysFileInfo.setSecretFlag(sysFileInfoRequest.getSecretFlag());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -135,15 +135,23 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
 | 
			
		|||
        // 文件请求转换存入数据库的附件信息
 | 
			
		||||
        SysFileInfo sysFileInfo = FileInfoFactory.createSysFileInfo(file, sysFileInfoRequest);
 | 
			
		||||
 | 
			
		||||
        // 默认版本号从1开始
 | 
			
		||||
        sysFileInfo.setFileVersion(1);
 | 
			
		||||
 | 
			
		||||
        // 文件编码生成
 | 
			
		||||
        sysFileInfo.setFileCode(IdWorker.getId());
 | 
			
		||||
 | 
			
		||||
        // 保存附件到附件信息表
 | 
			
		||||
        // 保存文件信息
 | 
			
		||||
        this.save(sysFileInfo);
 | 
			
		||||
 | 
			
		||||
        // 存储文件到云或者本地
 | 
			
		||||
        try {
 | 
			
		||||
            byte[] bytes = file.getBytes();
 | 
			
		||||
 | 
			
		||||
            // 如果是存在数据库库里,单独处理
 | 
			
		||||
            if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
 | 
			
		||||
                sysFileStorageService.saveFile(sysFileInfo.getFileId(), bytes);
 | 
			
		||||
            } else {
 | 
			
		||||
                fileOperatorApi.storageFile(sysFileInfo.getFileBucket(), sysFileInfo.getFileObjectName(), bytes);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            throw new FileException(FileExceptionEnum.ERROR_FILE, e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 返回文件信息体
 | 
			
		||||
        SysFileInfoResponse fileUploadInfoResult = new SysFileInfoResponse();
 | 
			
		||||
        BeanUtil.copyProperties(sysFileInfo, fileUploadInfoResult);
 | 
			
		||||
| 
						 | 
				
			
			@ -165,30 +173,33 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
 | 
			
		|||
 | 
			
		||||
        Long fileCode = sysFileInfoRequest.getFileCode();
 | 
			
		||||
 | 
			
		||||
        // 转换存入数据库的附件信息
 | 
			
		||||
        SysFileInfo sysFileInfo = FileInfoFactory.createSysFileInfo(file, sysFileInfoRequest);
 | 
			
		||||
        sysFileInfo.setDelFlag(YesOrNotEnum.Y.getCode());
 | 
			
		||||
        sysFileInfo.setFileCode(fileCode);
 | 
			
		||||
 | 
			
		||||
        // 查询该code下的最新版本号附件信息
 | 
			
		||||
        LambdaQueryWrapper<SysFileInfo> queryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        queryWrapper.eq(SysFileInfo::getFileCode, fileCode);
 | 
			
		||||
        queryWrapper.eq(SysFileInfo::getDelFlag, YesOrNotEnum.N.getCode());
 | 
			
		||||
        queryWrapper.eq(SysFileInfo::getFileStatus, FileStatusEnum.NEW.getCode());
 | 
			
		||||
        SysFileInfo fileInfo = this.getOne(queryWrapper);
 | 
			
		||||
        if (ObjectUtil.isEmpty(fileInfo)) {
 | 
			
		||||
        SysFileInfo oldFileInfo = this.getOne(queryWrapper);
 | 
			
		||||
        if (ObjectUtil.isEmpty(oldFileInfo)) {
 | 
			
		||||
            throw new FileException(FileExceptionEnum.NOT_EXISTED);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 旧文件状态的改变
 | 
			
		||||
        oldFileInfo.setFileStatus(FileStatusEnum.OLD.getCode());
 | 
			
		||||
        this.updateById(oldFileInfo);
 | 
			
		||||
 | 
			
		||||
        // 创建新文件信息
 | 
			
		||||
        SysFileInfo newFileInfo = FileInfoFactory.createSysFileInfo(file, sysFileInfoRequest);
 | 
			
		||||
 | 
			
		||||
        // 设置版本号在原本的基础上加一
 | 
			
		||||
        sysFileInfo.setFileVersion(fileInfo.getFileVersion() + 1);
 | 
			
		||||
        newFileInfo.setFileCode(fileCode);
 | 
			
		||||
        newFileInfo.setFileVersion(oldFileInfo.getFileVersion() + 1);
 | 
			
		||||
 | 
			
		||||
        // 存储新版本文件信息
 | 
			
		||||
        this.save(sysFileInfo);
 | 
			
		||||
        this.save(newFileInfo);
 | 
			
		||||
 | 
			
		||||
        // 返回文件信息体
 | 
			
		||||
        SysFileInfoResponse fileUploadInfoResult = new SysFileInfoResponse();
 | 
			
		||||
        BeanUtil.copyProperties(sysFileInfo, fileUploadInfoResult);
 | 
			
		||||
        BeanUtil.copyProperties(newFileInfo, fileUploadInfoResult);
 | 
			
		||||
        return fileUploadInfoResult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue