feat: 上传接口做优化(目前只使用了/api/file/upload,其他接口前端没使用)

This commit is contained in:
old burden 2026-04-13 17:15:43 +08:00
parent 73f4fcdaf6
commit 3328aae4e3
4 changed files with 50 additions and 14 deletions

View File

@ -1,6 +1,7 @@
package com.ruoyi.api; package com.ruoyi.api;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TencentCosUtil; import com.ruoyi.common.utils.TencentCosUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -28,11 +29,16 @@ public class CosController {
@PostMapping("/upload") @PostMapping("/upload")
public AjaxResult upload( public AjaxResult upload(
@ApiParam(name = "file", value = "文件", required = true) @ApiParam(name = "file", value = "文件", required = true)
@RequestParam("file") MultipartFile file) throws Exception { @RequestParam("file") MultipartFile file,
String uploadUrl = tencentCosUtil.uploadMultipartFile(file, true); @ApiParam(name = "prefix", value = "路径前缀如asset", required = false)
@RequestParam(value = "prefix", required = false) String prefix) throws Exception {
String uploadUrl = tencentCosUtil.uploadMultipartFile(file, true, prefix);
AjaxResult ajax = AjaxResult.success(uploadUrl); AjaxResult ajax = AjaxResult.success(uploadUrl);
ajax.put("url", uploadUrl); ajax.put("url", uploadUrl);
ajax.put("oldName", file.getOriginalFilename()); ajax.put("oldName", file.getOriginalFilename());
if (StringUtils.isNotBlank(prefix)) {
ajax.put("prefix", prefix);
}
return ajax; return ajax;
} }
} }

View File

@ -1,6 +1,7 @@
package com.ruoyi.api; package com.ruoyi.api;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TencentCosUtil; import com.ruoyi.common.utils.TencentCosUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -21,17 +22,25 @@ public class FileController {
private final TencentCosUtil tencentCosUtil; private final TencentCosUtil tencentCosUtil;
/** /**
* 文件上传 * 文件上传支持prefix路径前缀
*/ */
@ApiOperation(value = "文件上传") @ApiOperation(value = "文件上传")
@PostMapping("/upload") @PostMapping("/upload")
public AjaxResult upload( public AjaxResult upload(
@ApiParam(name = "file", value = "文件", required = true) @ApiParam(name = "file", value = "文件", required = true)
@RequestParam("file") MultipartFile file) throws Exception { @RequestParam("file") MultipartFile file,
@ApiParam(name = "prefix", value = "路径前缀如asset、generated等", required = false)
@RequestParam(value = "prefix", required = false) String prefix) throws Exception {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
String uploadUrl = tencentCosUtil.uploadMultipartFile(file, true); String uploadUrl = tencentCosUtil.uploadMultipartFile(file, true, prefix);
ajax.put("url", uploadUrl); ajax.put("url", uploadUrl);
ajax.put("oldName", file.getOriginalFilename());
if (StringUtils.isNotBlank(prefix)) {
ajax.put("prefix", prefix);
}
return ajax; return ajax;
} }

View File

@ -142,16 +142,20 @@ public class CommonController {
} }
@PostMapping("/cos/upload") @PostMapping("/cos/upload")
public AjaxResult uploadCover(MultipartFile file) { public AjaxResult uploadCover(MultipartFile file,
@RequestParam(value = "prefix", required = false) String prefix) {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
String uploadUrl; String uploadUrl;
try { try {
uploadUrl = tencentCosUtil.upload(file); uploadUrl = tencentCosUtil.uploadMultipartFile(file, true, prefix);
} catch (Exception e) { } catch (Exception e) {
throw new BaseException("上传失败"); throw new BaseException("上传失败");
} }
ajax.put("url", uploadUrl); ajax.put("url", uploadUrl);
ajax.put("oldName", file.getOriginalFilename()); ajax.put("oldName", file.getOriginalFilename());
if (StringUtils.isNotBlank(prefix)) {
ajax.put("prefix", prefix);
}
return ajax; return ajax;
} }

View File

@ -60,7 +60,14 @@ public class TencentCosUtil {
* 与AwsS3Util.uploadMultipartFile方法接口兼容 * 与AwsS3Util.uploadMultipartFile方法接口兼容
*/ */
public String upload(MultipartFile file) throws Exception { public String upload(MultipartFile file) throws Exception {
return uploadMultipartFile(file, true); return uploadMultipartFile(file, true, null);
}
/**
* 兼容原有调用保留双参数版本
*/
public String uploadMultipartFile(MultipartFile file, boolean isPublic) throws Exception {
return uploadMultipartFile(file, isPublic, null);
} }
/** /**
@ -68,15 +75,16 @@ public class TencentCosUtil {
* *
* @param file 前端上传的MultipartFile * @param file 前端上传的MultipartFile
* @param isPublic 是否公开访问当前实现中忽略使用domain配置 * @param isPublic 是否公开访问当前实现中忽略使用domain配置
* @param prefix 自定义路径前缀 "asset"null或空时不添加前缀
* @return 文件访问地址URL字符串 * @return 文件访问地址URL字符串
*/ */
public String uploadMultipartFile(MultipartFile file, boolean isPublic) throws Exception { public String uploadMultipartFile(MultipartFile file, boolean isPublic, String prefix) throws Exception {
if (file.isEmpty()) { if (file.isEmpty()) {
throw new IllegalArgumentException("上传文件不能为空"); throw new IllegalArgumentException("上传文件不能为空");
} }
// 生成唯一文件键格式与AWS一致yyyy/MM/dd/uuid_filename // 生成唯一文件键支持prefix参数
String key = generateCosKey(file.getOriginalFilename()); String key = generateCosKey(file.getOriginalFilename(), prefix);
try { try {
InputStream inputStream = file.getInputStream(); InputStream inputStream = file.getInputStream();
@ -145,11 +153,20 @@ public class TencentCosUtil {
} }
/** /**
* 生成COS文件键与AWS保持一致的命名格式 * 生成COS文件键支持prefix前缀
* prefix=asset asset/yyyy/MM/dd/xxxxxxxx_filename
* prefix=null或空 yyyy/MM/dd/xxxxxxxx_filename
*/ */
private String generateCosKey(String originalFileName) { private String generateCosKey(String originalFileName, String prefix) {
String uuid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8); String uuid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
String dateTime = new DateTime().toString("yyyy/MM/dd"); String dateTime = new DateTime().toString("yyyy/MM/dd");
if (StringUtils.isNotBlank(prefix)) {
// 清理prefix防止出现多余斜杠
String cleanPrefix = prefix.trim().replaceAll("^/+|/+$", "");
return cleanPrefix + "/" + dateTime + "/" + uuid + "_" + originalFileName;
}
return dateTime + "/" + uuid + "_" + originalFileName; return dateTime + "/" + uuid + "_" + originalFileName;
} }