feat(file): 增强文件下载功能与实体定义

- 使用SysFile.Fields常量替代硬编码字符串字段名
- 增加文件不存在时的日志警告与提前返回处理
- 为SysFile实体添加FieldNameConstants注解与Serial标记
- 优化文件下载响应头设置与异常处理逻辑
This commit is contained in:
PIG AI committed 2025-07-04 12:07:06 +08:00
1 parent c8edf16536
commit 809b17da68
2 files changed
+11 -2

No files matched your search

@@ -23,7 +23,9 @@ import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.FieldNameConstants;
import java.io.Serial;
import java.time.LocalDateTime;
/**
@@ -34,10 +36,12 @@ import java.time.LocalDateTime;
*/
@Data
@TenantTable
@FieldNameConstants
@Schema(description = "文件")
@EqualsAndHashCode(callSuper = true)
public class SysFile extends Model<SysFile> {
@Serial
private static final long serialVersionUID = 1L;
/**
@@ -118,16 +118,21 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
TenantContextHolder.setTenantSkip();
// 增加历史数据兼容 /admin/sys-file/local?fileName=xxx.png
Map<String, String> stringMap = HttpUtil.decodeParamMap(fileName, Charset.defaultCharset());
String urlFileName = MapUtil.getStr(stringMap, "fileName");
String urlFileName = MapUtil.getStr(stringMap, SysFile.Fields.fileName);
if (StrUtil.isNotBlank(urlFileName)) {
fileName = urlFileName;
}
SysFile sysFile = baseMapper.selectOne(Wrappers.<SysFile>lambdaQuery().eq(SysFile::getFileName, fileName), false);
if (Objects.isNull(sysFile)) {
log.warn("文件不存在: {}", fileName);
return;
}
try (S3Object s3Object = fileTemplate.getObject(sysFile.getBucketName(), sysFile.getDir(), fileName)) {
response.setContentType("application/octet-stream; charset=UTF-8");
// 文件唯一hash
response.addHeader("Hash", sysFile.getHash());
response.addHeader(SysFile.Fields.hash, sysFile.getHash());
response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLUtil.encode(sysFile.getOriginal()));
IoUtil.copy(s3Object.getObjectContent(), response.getOutputStream());
} catch (Exception e) {