fix:文件上传

ln_ry20250512
wangxy 4 weeks ago
parent 51f8308ab7
commit c8f445de18

@ -0,0 +1,233 @@
package com.ruoyi.web.controller.manager;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.config.ServerConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.file.TdFileRelation;
import com.ruoyi.system.service.file.TdFileRelationService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* packageName com.hyp.web.controller.manager
*
* @author wangxy
* @version JDK 8
* @className FileRelationManager
* @date 2024/4/12
* @description
*/
@Component
public class FileRelationManager {
@Resource
private TdFileRelationService fileRelationService;
@Resource
private ServerConfig serverConfig;
/**
*
*
*/
private static final Integer FILE_STATE_WTG = 2;
/**
*
*
* @return boolean
*/
public boolean delFile(String fileId){
TdFileRelation fileRelation = fileRelationService.getById(fileId);
if(Objects.isNull(fileRelation)){
throw new ServiceException("文件不存在");
}
FileUtil.del(fileRelation.getFilePath());
return fileRelationService.removeById(fileId);
}
/**
*
*
* @param applyId
* @param fileCode
* @param fileState
* @return boolean
*/
public boolean filePass( String applyId, String fileCode, Integer fileState){
return fileRelationService.lambdaUpdate()
.eq(TdFileRelation::getApplyId,applyId)
.eq(TdFileRelation::getFileCode,fileCode)
.set(TdFileRelation::getFileState,fileState)
.update();
}
/**
*
*
* @param fileId
* @param fileState
* @return boolean
*/
public boolean pass( String fileId, Integer fileState){
return fileRelationService.lambdaUpdate()
.eq(TdFileRelation::getFileId,fileId)
.set(TdFileRelation::getFileState,fileState)
.update();
}
/**
*
*
* @param applyId
* @return com.hyp.common.core.domain.AjaxResult
*/
public AjaxResult checkFile(String applyId){
List<TdFileRelation> list = fileRelationService.lambdaQuery()
.eq(TdFileRelation::getApplyId, applyId)
.list();
if(CollUtil.isNotEmpty(list)){
for(TdFileRelation rewFileRelation : list){
if(Objects.equals(rewFileRelation.getFileState(),FILE_STATE_WTG) || Objects.isNull(rewFileRelation.getFileState())){
return AjaxResult.error("材料存在未审核情况,请检查");
}
}
}
return AjaxResult.success();
}
/**
*
*
* @param applyId
* @param filename
* @param fileCode
* @param url
* @param originalFilename
* @return com.hyp.system.domain.RewFileRelation
*/
@Transactional(rollbackFor = Exception.class)
public TdFileRelation save(String applyId,String filename,String fileCode,String url,String originalFilename){
TdFileRelation rewFileRelation = new TdFileRelation();
rewFileRelation.setApplyId(applyId);
rewFileRelation.setFileName(filename);
rewFileRelation.setFileCode(fileCode);
rewFileRelation.setFilePath(url);
rewFileRelation.setRealName(originalFilename);
fileRelationService.save(rewFileRelation);
return rewFileRelation;
}
/**
*
*
* @param files
* @param applyId
* @param filename
* @param fileCode
* @return java.util.List<com.hyp.system.domain.RewFileRelation>
*/
@Transactional(rollbackFor = Exception.class)
public List<TdFileRelation> saveBatch(List<MultipartFile> files,
String applyId,
String filename,
String fileCode) throws IOException {
List<TdFileRelation> fileRelations = new ArrayList<>();
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
for (MultipartFile file : files) {
if (!file.isEmpty()) {
// 上传并返回新文件名称
String fileNames = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileNames;
if(StringUtils.isBlank(filename)){
filename = fileNames;
}
TdFileRelation rewFileRelation = new TdFileRelation();
rewFileRelation.setApplyId(applyId);
rewFileRelation.setFileName(filename);
rewFileRelation.setFileCode(fileCode);
rewFileRelation.setFilePath(url);
rewFileRelation.setRealName(FileUtils.getNameNotSuffix(file.getOriginalFilename()));
fileRelations.add(rewFileRelation);
}
}
fileRelationService.saveBatch(fileRelations);
return fileRelations;
}
/**
*
*
* @param fileId
* @return java.lang.String
*/
public String getFilePath(String fileId){
TdFileRelation fileRelation = fileRelationService.getById(fileId);
if(Objects.nonNull(fileRelation)){
return fileRelation.getFilePath();
}
return null;
}
/**
*
*
* @param fileId
* @return java.lang.String
*/
public String getRealName(String fileId){
TdFileRelation fileRelation = fileRelationService.getById(fileId);
if(Objects.nonNull(fileRelation)){
return fileRelation.getRealName();
}
return null;
}
/**
*
*
* @param applyId
* @param fileCode
* @return java.util.List<com.hyp.system.domain.RewFileRelation>
*/
public List<TdFileRelation> getFileInfo(String applyId,String fileCode){
LambdaQueryWrapper<TdFileRelation> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TdFileRelation::getApplyId,applyId);
queryWrapper.eq(Objects.nonNull(fileCode), TdFileRelation::getFileCode, fileCode);
return fileRelationService.list(queryWrapper);
}
/**
*
*
* @return java.util.List<com.hyp.system.domain.RewFileRelation>
*/
public TdFileRelation getRewFileRelation(String fileId){
return fileRelationService.getById(fileId);
}
}

@ -0,0 +1,196 @@
package com.ruoyi.web.controller.system.file;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.config.ServerConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.file.TdFileRelation;
import com.ruoyi.web.controller.manager.FileRelationManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;
import java.util.Objects;
/**
* packageName com.hyp.web.controller.reward
*
* @author wangxy
* @version JDK 8
* @className FileRelationController
* @date 2024/4/12
* @description
*/
@Api("文件")
@RestController
@RequestMapping("/system/file")
@Slf4j
public class FileRelationController extends BaseController {
@Resource
private FileRelationManager fileRelationManager;
@Resource
private ServerConfig serverConfig;
@ApiOperation("文件上传")
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file,
@RequestParam String applyId,
@RequestParam(required = false) String filename,
@RequestParam String fileCode) {
try {
if(file.isEmpty()){
throw new ServiceException("上传文件不能为空");
}
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileNames = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileNames;
if(StringUtils.isBlank(filename)){
filename = fileNames;
}
String originalFilename = FileUtils.getNameNotSuffix(file.getOriginalFilename()) ;
return AjaxResult.success(fileRelationManager.save(applyId,filename,fileCode,url,originalFilename));
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
/**
*
*/
@ApiOperation("多文件上传")
@PostMapping("/uploads")
public AjaxResult uploadFiles(List<MultipartFile> files,
@RequestParam String applyId,
@RequestParam(required = false) String filename,
@RequestParam String fileCode){
try {
return AjaxResult.success(fileRelationManager.saveBatch(files,applyId,filename,fileCode));
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
@ApiOperation("材料预览")
@GetMapping("fileView/{fileId}")
public void fileView(@PathVariable String fileId, HttpServletResponse response) throws IOException {
String filePath = fileRelationManager.getFilePath(fileId);
String fileName = fileRelationManager.getRealName(fileId);
String encodedFileName = new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1);
InputStream in = null;
OutputStream out = null;
try {
response.setHeader("content-disposition", "attachment;filename=" + encodedFileName + ".pdf");
// 设置文件ContentType类型这样设置会自动判断下载文件类型
response.setContentType("application/octet-stream;charset=utf-8");
File file = new File(filePath);
in = Files.newInputStream(file.toPath());
// 从response对象获取输出流
out = response.getOutputStream();
// 将输入流中的数据读取出来,写到输出流中
for (int b = -1; (b = in.read()) != -1; ) {
out.write(b);
}
} catch (Exception e) {
log.error("获取文件流失败:", e.getMessage(), e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
if (out != null) {
out.close();
}
}
}
}
}
@ApiOperation("材料删除")
@Log(title = "材料删除", businessType = BusinessType.DELETE)
@GetMapping("/delFile/{fileId}")
public AjaxResult delFile(@PathVariable String fileId){
return toAjax(fileRelationManager.delFile(fileId));
}
@ApiOperation("材料审核通过id")
@GetMapping("/filePass")
public AjaxResult pass(@RequestParam String fileId,
@RequestParam Integer fileState){
return toAjax(fileRelationManager.pass(fileId,fileState));
}
@ApiOperation("材料校验")
@GetMapping("/checkFile/{applyId}")
public AjaxResult checkFile(@PathVariable String applyId){
return fileRelationManager.checkFile(applyId);
}
@ApiOperation("文件查询")
@GetMapping("/getFileInfo")
public AjaxResult getFileInfo(@RequestParam String applyId,
@RequestParam(required = false) String fileCode) {
return success(fileRelationManager.getFileInfo(applyId,fileCode));
}
@ApiOperation("文件下载")
@GetMapping("/download")
public void fileDownload(String fileId, HttpServletResponse response, HttpServletRequest request) {
try {
TdFileRelation rewFileRelation = fileRelationManager.getRewFileRelation(fileId);
if(Objects.isNull(rewFileRelation)){
throw new ServiceException("下载文件不存在");
}
String fileName = rewFileRelation.getFilePath();
if (!FileUtils.checkAllowDownload(fileName)) {
throw new ServiceException(com.ruoyi.common.utils.StringUtils.format("资源文件({})非法,不允许下载。 ", fileName));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(fileName, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
} catch (Exception e) {
log.error("下载文件失败", e);
}
}
}

@ -0,0 +1,49 @@
package com.ruoyi.system.domain.file;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* @author 13560
*
* @TableName td_file_relation
*/
@Data
public class TdFileRelation implements Serializable {
/**
*
*/
@TableId
private String fileId;
/**
* smid
*/
private String applyId;
/**
*
*/
private String fileName;
/**
*
*/
private String fileCode;
/**
*
*/
private String filePath;
/**
*
*/
private String realName;
/**
* 12
*/
private Integer fileState;
}

@ -0,0 +1,18 @@
package com.ruoyi.system.mapper.file;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.file.TdFileRelation;
/**
* @author Administrator
* @description td_file_relation()Mapper
* @createDate 2025-05-14 08:44:27
* @Entity generator.domain.TdFileRelation
*/
public interface TdFileRelationMapper extends BaseMapper<TdFileRelation> {
}

@ -0,0 +1,13 @@
package com.ruoyi.system.service.file;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.file.TdFileRelation;
/**
* @author Administrator
* @description td_file_relation()Service
* @createDate 2025-05-14 08:44:27
*/
public interface TdFileRelationService extends IService<TdFileRelation> {
}

@ -0,0 +1,22 @@
package com.ruoyi.system.service.file.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.domain.file.TdFileRelation;
import com.ruoyi.system.mapper.file.TdFileRelationMapper;
import com.ruoyi.system.service.file.TdFileRelationService;
import org.springframework.stereotype.Service;
/**
* @author Administrator
* @description td_file_relation()Service
* @createDate 2025-05-14 08:44:27
*/
@Service
public class TdFileRelationServiceImpl extends ServiceImpl<TdFileRelationMapper, TdFileRelation>
implements TdFileRelationService {
}

@ -0,0 +1,22 @@
<?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="com.ruoyi.system.mapper.file.TdFileRelationMapper">
<resultMap id="BaseResultMap" type="com.ruoyi.system.domain.file.TdFileRelation">
<id property="fileId" column="file_id" jdbcType="VARCHAR"/>
<result property="applyId" column="apply_id" jdbcType="VARCHAR"/>
<result property="fileName" column="file_name" jdbcType="VARCHAR"/>
<result property="fileCode" column="file_code" jdbcType="VARCHAR"/>
<result property="filePath" column="file_path" jdbcType="VARCHAR"/>
<result property="realName" column="real_name" jdbcType="VARCHAR"/>
<result property="fileState" column="file_state" jdbcType="INTEGER"/>
</resultMap>
<sql id="Base_Column_List">
file_id,apply_id,file_name,
file_code,file_path,real_name,
file_state
</sql>
</mapper>
Loading…
Cancel
Save