【7.1.6】【file】增加file_storage表,用来存储系统默认图片

pull/25/head
fengshuonan 2022-01-08 17:10:04 +08:00
parent 559a74ace5
commit 82484c9cd6
11 changed files with 183 additions and 46 deletions

View File

@ -53,7 +53,12 @@ public enum FileLocationEnum {
/** /**
* *
*/ */
LOCAL(4); LOCAL(4),
/**
*
*/
DB(5);
private final Integer code; private final Integer code;

View File

@ -106,14 +106,4 @@ public class FileConfigExpander {
return ConfigContext.me().getSysConfigValueWithDefault("SYS_LOCAL_FILE_SAVE_PATH_WINDOWS", String.class, new LocalFileProperties().getLocalFileSavePathWin()); return ConfigContext.me().getSysConfigValueWithDefault("SYS_LOCAL_FILE_SAVE_PATH_WINDOWS", String.class, new LocalFileProperties().getLocalFileSavePathWin());
} }
/**
* base64
*
* @author fengshuonan
* @date 2020/12/29 20:10
*/
public static String getDefaultAvatarBase64() {
return ConfigContext.me().getSysConfigValueWithDefault("SYS_DEFAULT_AVATAR_BASE64", String.class, FileConstants.DEFAULT_BASE_64_AVATAR);
}
} }

View File

@ -72,6 +72,10 @@ public class SysFileInfoController {
/** /**
* *
* <p>
* fileLocation5
* <p>
* fileLocation
* *
* @author majianguo * @author majianguo
* @date 2020/12/27 13:17 * @date 2020/12/27 13:17

View File

@ -0,0 +1,32 @@
package cn.stylefeng.roses.kernel.file.modular.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
*
*
* @author fengshuonan
* @date 2022/01/08 15:53
*/
@TableName("sys_file_storage")
@Data
public class SysFileStorage {
/**
* idfile_info
*/
@TableId(value = "file_id", type = IdType.ASSIGN_ID)
private Long fileId;
/**
*
*/
@TableField("file_bytes")
private byte[] fileBytes;
}

View File

@ -31,12 +31,14 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi; 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.enums.FileStatusEnum;
import cn.stylefeng.roses.kernel.file.api.exception.FileException; 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.exception.enums.FileExceptionEnum;
import cn.stylefeng.roses.kernel.file.api.expander.FileConfigExpander; 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.api.pojo.request.SysFileInfoRequest;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileInfo; 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 com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -62,6 +64,7 @@ public class FileInfoFactory {
public static SysFileInfo createSysFileInfo(MultipartFile file, SysFileInfoRequest sysFileInfoRequest) { public static SysFileInfo createSysFileInfo(MultipartFile file, SysFileInfoRequest sysFileInfoRequest) {
FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class); FileOperatorApi fileOperatorApi = SpringUtil.getBean(FileOperatorApi.class);
SysFileStorageService fileStorageService = SpringUtil.getBean(SysFileStorageService.class);
// 生成文件的唯一id // 生成文件的唯一id
Long fileId = IdWorker.getId(); Long fileId = IdWorker.getId();
@ -88,7 +91,12 @@ public class FileInfoFactory {
if (StrUtil.isNotEmpty(sysFileInfoRequest.getFileBucket())) { if (StrUtil.isNotEmpty(sysFileInfoRequest.getFileBucket())) {
fileBucket = sysFileInfoRequest.getFileBucket(); fileBucket = sysFileInfoRequest.getFileBucket();
} }
fileOperatorApi.storageFile(fileBucket, finalFileName, bytes); // 如果是存在数据库库里,单独处理一下
if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
fileStorageService.saveFile(fileId, bytes);
} else {
fileOperatorApi.storageFile(fileBucket, finalFileName, bytes);
}
} catch (IOException e) { } catch (IOException e) {
throw new FileException(FileExceptionEnum.ERROR_FILE, e.getMessage()); throw new FileException(FileExceptionEnum.ERROR_FILE, e.getMessage());
} }
@ -102,7 +110,12 @@ public class FileInfoFactory {
// 封装存储文件信息(上传替换公共信息) // 封装存储文件信息(上传替换公共信息)
SysFileInfo sysFileInfo = new SysFileInfo(); SysFileInfo sysFileInfo = new SysFileInfo();
sysFileInfo.setFileId(fileId); sysFileInfo.setFileId(fileId);
sysFileInfo.setFileLocation(fileOperatorApi.getFileLocationEnum().getCode()); // 如果是存在数据库库里,单独处理一下
if (FileLocationEnum.DB.getCode().equals(sysFileInfoRequest.getFileLocation())) {
sysFileInfo.setFileLocation(FileLocationEnum.DB.getCode());
} else {
sysFileInfo.setFileLocation(fileOperatorApi.getFileLocationEnum().getCode());
}
sysFileInfo.setFileBucket(fileBucket); sysFileInfo.setFileBucket(fileBucket);
sysFileInfo.setFileObjectName(finalFileName); sysFileInfo.setFileObjectName(finalFileName);
sysFileInfo.setFileOriginName(originalFilename); sysFileInfo.setFileOriginName(originalFilename);

View File

@ -0,0 +1,14 @@
package cn.stylefeng.roses.kernel.file.modular.mapper;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileStorage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* Mapper
*
* @author fengshuonan
* @date 2022/01/08 15:53
*/
public interface SysFileStorageMapper extends BaseMapper<SysFileStorage> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.stylefeng.roses.kernel.file.modular.mapper.SysFileStorageMapper">
</mapper>

View File

@ -0,0 +1,40 @@
package cn.stylefeng.roses.kernel.file.modular.service;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileStorage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
*
* @author fengshuonan
* @date 2022/01/08 15:53
*/
public interface SysFileStorageService extends IService<SysFileStorage> {
/**
*
*
* @author fengshuonan
* @date 2022/1/8 16:08
*/
void saveFile(Long fileId, byte[] bytes);
/**
* 访url
*
* @param fileId id
* @author fengshuonan
* @date 2022/1/8 16:12
*/
String getFileAuthUrl(String fileId);
/**
* 访url
*
* @param fileId id
* @author fengshuonan
* @date 2022/1/8 16:12
*/
String getFileUnAuthUrl(String fileId);
}

View File

@ -25,7 +25,6 @@
package cn.stylefeng.roses.kernel.file.modular.service.impl; package cn.stylefeng.roses.kernel.file.modular.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
@ -37,7 +36,6 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.file.api.FileInfoApi; import cn.stylefeng.roses.kernel.file.api.FileInfoApi;
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi; import cn.stylefeng.roses.kernel.file.api.FileOperatorApi;
import cn.stylefeng.roses.kernel.file.api.constants.FileConstants;
import cn.stylefeng.roses.kernel.file.api.enums.FileLocationEnum; 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.enums.FileStatusEnum;
import cn.stylefeng.roses.kernel.file.api.exception.FileException; import cn.stylefeng.roses.kernel.file.api.exception.FileException;
@ -50,11 +48,12 @@ import cn.stylefeng.roses.kernel.file.api.util.DownloadUtil;
import cn.stylefeng.roses.kernel.file.api.util.PdfFileTypeUtil; import cn.stylefeng.roses.kernel.file.api.util.PdfFileTypeUtil;
import cn.stylefeng.roses.kernel.file.api.util.PicFileTypeUtil; import cn.stylefeng.roses.kernel.file.api.util.PicFileTypeUtil;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileInfo; import cn.stylefeng.roses.kernel.file.modular.entity.SysFileInfo;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileStorage;
import cn.stylefeng.roses.kernel.file.modular.factory.FileInfoFactory; import cn.stylefeng.roses.kernel.file.modular.factory.FileInfoFactory;
import cn.stylefeng.roses.kernel.file.modular.mapper.SysFileInfoMapper; import cn.stylefeng.roses.kernel.file.modular.mapper.SysFileInfoMapper;
import cn.stylefeng.roses.kernel.file.modular.service.SysFileInfoService; import cn.stylefeng.roses.kernel.file.modular.service.SysFileInfoService;
import cn.stylefeng.roses.kernel.file.modular.service.SysFileStorageService;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@ -93,6 +92,9 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
@Resource @Resource
private FileOperatorApi fileOperatorApi; private FileOperatorApi fileOperatorApi;
@Resource
private SysFileStorageService sysFileStorageService;
@Override @Override
public SysFileInfoResponse getFileInfoResult(Long fileId) { public SysFileInfoResponse getFileInfoResult(Long fileId) {
@ -104,7 +106,13 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
// 获取文件字节码 // 获取文件字节码
byte[] fileBytes; byte[] fileBytes;
try { try {
fileBytes = fileOperatorApi.getFileBytes(FileConfigExpander.getDefaultBucket(), sysFileInfo.getFileObjectName()); // 如果是存储在数据库从数据库中获取其他的方式走FileOperatorApi
if (FileLocationEnum.DB.getCode().equals(sysFileInfo.getFileLocation())) {
SysFileStorage storage = sysFileStorageService.getById(fileId);
fileBytes = storage.getFileBytes();
} else {
fileBytes = fileOperatorApi.getFileBytes(FileConfigExpander.getDefaultBucket(), sysFileInfo.getFileObjectName());
}
} catch (Exception e) { } catch (Exception e) {
log.error("获取文件流异常,具体信息为:{}", e.getMessage()); log.error("获取文件流异常,具体信息为:{}", e.getMessage());
throw new FileException(FileExceptionEnum.FILE_STREAM_ERROR, e.getMessage()); throw new FileException(FileExceptionEnum.FILE_STREAM_ERROR, e.getMessage());
@ -212,7 +220,12 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
// 删除具体文件 // 删除具体文件
for (SysFileInfo fileInfo : fileInfos) { for (SysFileInfo fileInfo : fileInfos) {
this.fileOperatorApi.deleteFile(fileInfo.getFileBucket(), fileInfo.getFileObjectName()); //如果文件是在数据库存储,则特殊处理
if (fileInfo.getFileLocation().equals(FileLocationEnum.DB.getCode())) {
this.sysFileStorageService.removeById(fileInfo.getFileId());
} else {
this.fileOperatorApi.deleteFile(fileInfo.getFileBucket(), fileInfo.getFileObjectName());
}
} }
} }
@ -296,12 +309,6 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
@Override @Override
public void preview(SysFileInfoRequest sysFileInfoRequest, HttpServletResponse response) { public void preview(SysFileInfoRequest sysFileInfoRequest, HttpServletResponse response) {
// 如果是默认头像
if (FileConstants.DEFAULT_AVATAR_FILE_ID.equals(sysFileInfoRequest.getFileId())) {
DownloadUtil.renderPreviewFile(response, Base64.decode(FileConfigExpander.getDefaultAvatarBase64()));
return;
}
// 根据文件id获取文件信息结果集 // 根据文件id获取文件信息结果集
SysFileInfoResponse sysFileInfoResponse = this.getFileInfoResult(sysFileInfoRequest.getFileId()); SysFileInfoResponse sysFileInfoResponse = this.getFileInfoResult(sysFileInfoRequest.getFileId());
@ -358,13 +365,6 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
@Override @Override
public void previewByBucketAndObjName(SysFileInfoRequest sysFileInfoRequest, HttpServletResponse response) { public void previewByBucketAndObjName(SysFileInfoRequest sysFileInfoRequest, HttpServletResponse response) {
// 如果是默认头像
if (FileConstants.DEFAULT_AVATAR_FILE_OBJ_NAME.equals(sysFileInfoRequest.getFileObjectName())
|| FileConstants.DEFAULT_AVATAR_FILE_FINAL_NAME.equals(sysFileInfoRequest.getFileObjectName())) {
DownloadUtil.renderPreviewFile(response, Base64.decode(FileConfigExpander.getDefaultAvatarBase64()));
return;
}
// 判断文件是否需要鉴权需要鉴权的需要带token访问 // 判断文件是否需要鉴权需要鉴权的需要带token访问
LambdaQueryWrapper<SysFileInfo> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysFileInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysFileInfo::getFileObjectName, sysFileInfoRequest.getFileObjectName()); wrapper.eq(SysFileInfo::getFileObjectName, sysFileInfoRequest.getFileObjectName());
@ -439,11 +439,9 @@ public class SysFileInfoServiceImpl extends ServiceImpl<SysFileInfoMapper, SysFi
sysFileInfoRequest.setFileId(fileId); sysFileInfoRequest.setFileId(fileId);
SysFileInfo sysFileInfo = querySysFileInfo(sysFileInfoRequest); SysFileInfo sysFileInfo = querySysFileInfo(sysFileInfoRequest);
// 如果是本地存储,则返回本地存储方式的文件预览 // 如果是数据库存储则返回previewUrl
if (sysFileInfo.getFileLocation().equals(FileLocationEnum.LOCAL.getCode())) { if (sysFileInfo.getFileLocation().equals(FileLocationEnum.DB.getCode())) {
// 获取context-path return this.sysFileStorageService.getFileAuthUrl(String.valueOf(fileId));
String contextPath = HttpServletUtil.getRequest().getContextPath();
return FileConfigExpander.getServerDeployHost() + contextPath + FileConstants.FILE_PRIVATE_PREVIEW_URL + "?fileId=" + fileId + "&token=" + token;
} else { } else {
// 返回第三方存储文件url // 返回第三方存储文件url
return fileOperatorApi.getFileAuthUrl(sysFileInfo.getFileBucket(), sysFileInfo.getFileObjectName(), FileConfigExpander.getDefaultFileTimeoutSeconds()); return fileOperatorApi.getFileAuthUrl(sysFileInfo.getFileBucket(), sysFileInfo.getFileObjectName(), FileConfigExpander.getDefaultFileTimeoutSeconds());

View File

@ -0,0 +1,46 @@
package cn.stylefeng.roses.kernel.file.modular.service.impl;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.file.api.constants.FileConstants;
import cn.stylefeng.roses.kernel.file.api.expander.FileConfigExpander;
import cn.stylefeng.roses.kernel.file.modular.entity.SysFileStorage;
import cn.stylefeng.roses.kernel.file.modular.mapper.SysFileStorageMapper;
import cn.stylefeng.roses.kernel.file.modular.service.SysFileStorageService;
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
*
*
* @author fengshuonan
* @date 2022/01/08 15:53
*/
@Service
public class SysFileStorageServiceImpl extends ServiceImpl<SysFileStorageMapper, SysFileStorage> implements SysFileStorageService {
@Override
public void saveFile(Long fileId, byte[] bytes) {
SysFileStorage sysFileStorage = new SysFileStorage();
sysFileStorage.setFileId(fileId);
sysFileStorage.setFileBytes(bytes);
this.save(sysFileStorage);
}
@Override
public String getFileAuthUrl(String fileId) {
// 获取登录用户的token
String token = LoginContext.me().getToken();
// 获取context-path
String contextPath = HttpServletUtil.getRequest().getContextPath();
return FileConfigExpander.getServerDeployHost() + contextPath + FileConstants.FILE_PRIVATE_PREVIEW_URL + "?fileId=" + fileId + "&token=" + token;
}
@Override
public String getFileUnAuthUrl(String fileId) {
// 获取context-path
String contextPath = HttpServletUtil.getRequest().getContextPath();
return FileConfigExpander.getServerDeployHost() + contextPath + FileConstants.FILE_PUBLIC_PREVIEW_URL + "?fileId=" + fileId;
}
}