首先设计附件表结构,用于存储附件
![](https://img-blog.csdnimg.cn/b751c0b95c8249cba9231dc4c643a75e.png)
附加结构
controller层代码
package com.sinosoft.springbootplus.files.controller;
import com.sinosoft.springbootplus.common.api.ApiResult;
import com.sinosoft.springbootplus.common.controller.BaseController;
import com.sinosoft.springbootplus.files.application.service.impl.JgjgFileServiceImpl;
import com.sinosoft.springbootplus.files.domain.entity.JgjgFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* <pre>
* 监管机构 附件API
* </pre>
*
* @author wp
* @since 2022-05-23
*/
@Slf4j
@RestController
@RequestMapping("/jgjgFile")
@Api(tags="监管机构系统-附件API",description = "提供监管机构系统-附件相关的 Rest API")
public class JgjgFileController extends BaseController {
private JgjgFileServiceImpl jgjgFileServiceImpl;
public JgjgFileController(JgjgFileServiceImpl jgjgFileServiceImpl) {
this.jgjgFileServiceImpl = jgjgFileServiceImpl;
}
/**
* 上传附件
* @author wp
* @date 2022/5/23
* @param file MultipartFile
* @return ApiResult<JgjgFile>
*/
@PostMapping("/upload")
@ApiOperation(value = "上传附件", notes = "上传附件", response = ApiResult.class)
public ApiResult<JgjgFile> uploadFile(@RequestParam("file") MultipartFile file) {
return jgjgFileServiceImpl.uploadFile(file);
}
/**
* 下载附件
* @author wp
* @date 2022/5/23
* @param id 附件ID
* @param response 响应
*/
@GetMapping("/download/{id}")
@ApiOperation(value = "下载附件", notes = "下载附件")
public void downloadFile(@PathVariable("id") Long id, HttpServletResponse response) {
jgjgFileServiceImpl.downloadFile(id, response);
}
/**
* 删除附件
* @author wp
* @date 2022/5/23
* @param id 附件ID
*/
@GetMapping("deleted/{id}")
@ApiOperation(value = "删除附件", notes = "删除附件")
public void deletedFile(@PathVariable("id") Long id) {
jgjgFileServiceImpl.deletedFile(id);
}
}
service层代码
package com.sinosoft.springbootplus.files.application.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.sinosoft.springbootplus.common.api.ApiResult;
import com.sinosoft.springbootplus.files.domain.entity.JgjgFile;
import com.sinosoft.springbootplus.files.domain.mapper.JgjgFileMapper;
import com.sinosoft.springbootplus.mybatis.service.impl.BaseServiceImpl;
import com.sinosoft.springbootplus.oss.OssClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* <pre>
* 监管机构系统-附件表 服务实现类
* </pre>
*
* @author wp
* @since 2022-05-10
*/
@Slf4j
@Service
public class JgjgFileServiceImpl extends BaseServiceImpl<JgjgFileMapper, JgjgFile> {
// 文件操作
private OssClient ossClient;
public JgjgFileServiceImpl(OssClient ossClient) {
this.ossClient = ossClient;
}
@Transactional(rollbackFor = Exception.class)
public boolean saveJgjgFile(JgjgFile jgjgFile) {
return super.save(jgjgFile);
}
@Transactional(rollbackFor = Exception.class)
public boolean deleteJgjgFile(Long id) {
return super.removeById(id);
}
public JgjgFile getJgjgFileById(Long id) {
return super.getById(id);
}
/**
* 上传附件
* @author wp
* @date 2022/5/23
* @param file MultipartFile
* @return ApiResult<JgjgFile>
*/
public ApiResult<JgjgFile> uploadFile(MultipartFile file) {
if (log.isDebugEnabled()) {
log.debug("content-type={}", file.getContentType());
log.debug("name={}", file.getName());
log.debug("original-filename={}", file.getOriginalFilename());
}
String fileName = ossClient.uploadFile(file);
if (StringUtils.isBlank(fileName)) {
log.error("文件上传失败!文件名为空!");
return ApiResult.fail("文件上传失败!文件名为空!");
}
try {
// 保存附件信息
JgjgFile saveFile = new JgjgFile().setFileName(fileName)
.setOriginalName(file.getOriginalFilename());
boolean isSuccess = saveJgjgFile(saveFile);
if (!isSuccess) {
ossClient.delFile(fileName);
log.error("文件上传失败!保存文件信息失败!文件信息:[{}]", saveFile);
return ApiResult.fail("文件上传失败!保存文件信息失败!");
}
return ApiResult.ok(saveFile);
} catch (Exception e) {
try {
ossClient.delFile(fileName);
} catch (Exception ex) {
log.error("文件删除失败,失败原因:[{}]", ex.getMessage());
return ApiResult.fail("文件删除失败,失败原因:" + e.getMessage());
}
log.error("文件上传失败,失败原因:[{}]", e.getMessage());
return ApiResult.fail("文件上传失败,失败原因:" + e.getMessage());
}
}
/**
* 下载附件
* @author wp
* @date 2022/5/23
* @param id 附件ID
* @param response 响应
*/
public void downloadFile(Long id, HttpServletResponse response) {
JgjgFile jgjgFile = getJgjgFileById(id);
if (ObjectUtil.isNull(jgjgFile)) {
log.error("ID:[{}]未查询到附件,请检查数据是否正确", id);
}
try {
ossClient.downloadFile(jgjgFile.getFileName(), jgjgFile.getOriginalName(), response);
} catch (Exception e) {
log.error("文件下载失败,失败原因:[{}]", e.getMessage());
}
}
/**
* 删除附件
* @author wp
* @date 2022/5/23
* @param id 附件ID
*/
public void deletedFile(Long id) {
JgjgFile jgjgFile = getJgjgFileById(id);
if (ObjectUtil.isNull(jgjgFile)) {
log.error("ID:[{}]未查询到附件,请检查数据是否正确", id);
}
try {
boolean isSuccess = deleteJgjgFile(id);
if (!isSuccess) {
log.error("文件删除失败");
}
ossClient.delFile(jgjgFile.getFileName());
} catch (Exception e) {
log.error("文件删除失败,失败原因:[{}]", e.getMessage());
}
}
}
mapper层代码
package com.sinosoft.springbootplus.files.domain.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinosoft.springbootplus.files.domain.entity.JgjgFile;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
/**
* <pre>
* 监管机构系统-附件表 Mapper 接口
* </pre>
*
* @author wp
* @since 2022-05-10
*/
@Repository
public interface JgjgFileMapper extends BaseMapper<JgjgFile> {
/**
* 获取分页对象
*
* @param page 分页信息
* @param wrapper 监管机构系统-附件表查询参数
* @return
*/
@Select("select id, owner_id, file_id, file_name, owner_type, revision, created_by, created_time, tenant_id FROM jgjg_file ${ew.customSqlSegment}")
IPage<JgjgFile> getJgjgFilePageList(Page page, @Param(Constants.WRAPPER) Wrapper<JgjgFile> wrapper);
}
repository代码
package com.sinosoft.springbootplus.files.domain.repository;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinosoft.springbootplus.files.domain.entity.JgjgFile;
import com.sinosoft.springbootplus.files.domain.mapper.JgjgFileMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <pre>
* 监管机构系统-附件 仓储服务
* </pre>
*
* @author wp
* @since 2022-05-23
*/
@Slf4j
@Repository
public class JgjgFileRepository extends ServiceImpl<JgjgFileMapper, JgjgFile> {
private JgjgFileMapper jgjgFileMapper;
public JgjgFileRepository(JgjgFileMapper jgjgFileMapper) {
this.jgjgFileMapper = jgjgFileMapper;
}
public List<JgjgFile> getJgjgFileList(QueryWrapper<JgjgFile> queryWrapper) {
return jgjgFileMapper.selectList(queryWrapper);
}
}
domain层代码
package com.sinosoft.springbootplus.files.domain.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sinosoft.springbootplus.files.domain.entity.JgjgFile;
import com.sinosoft.springbootplus.files.domain.repository.JgjgFileRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <pre>
* 监管机构系统-附件 领域服务
* </pre>
*
* @author wp
* @since 2022-05-23
*/
@Slf4j
@Service
public class JgjgFileDomain {
private JgjgFileRepository jgjgFileRepository;
public JgjgFileDomain(JgjgFileRepository jgjgFileRepository) {
this.jgjgFileRepository = jgjgFileRepository;
}
/**
* 批量修改附件信息
* @author wp
* @date 2022/5/23
* @param jgjgFileList 附件信息集合
* @return boolean
*/
public boolean updateBatch(List<JgjgFile> jgjgFileList) {
return jgjgFileRepository.updateBatchById(jgjgFileList);
}
/**
* 获取附件信息集合
* @author wp
* @date 2022/5/23
* @param jgjgFile 附件查询参数
* @return List<JgjgFile>
*/
public List<JgjgFile> getJgjgFileList(JgjgFile jgjgFile) {
if (CollUtil.isEmpty(jgjgFile.getOwnerIdList())) {
return null;
}
QueryWrapper<JgjgFile> queryWrapper = Wrappers.<JgjgFile>query()
.eq(StringUtils.isNotBlank(jgjgFile.getOwnerType()), "owner_type", jgjgFile.getOwnerType())
.in(CollUtil.isNotEmpty(jgjgFile.getOwnerIdList()), "owner_id", jgjgFile.getOwnerIdList());
return jgjgFileRepository.getJgjgFileList(queryWrapper);
}
/**
* 补全附件信息
* @author wp
* @date 2022/5/23
* @param jgjgFileList 附件信息集合
* @param ownerId 所属信息ID
* @param ownerType 所属表类型
* @return List<JgjgFile>
*/
public List<JgjgFile> completeJgjgFiles(List<JgjgFile> jgjgFileList, Long ownerId, String ownerType) {
if (CollUtil.isEmpty(jgjgFileList)) {
return null;
}
for (JgjgFile jgjgFile : jgjgFileList) {
jgjgFile.setOwnerId(ownerId).setOwnerType(ownerType);
}
return jgjgFileList;
}
}