芋道源码 - 本地文件上传配置与实现
一、application.yaml 配置
sms-code: # 短信验证码相关的配置项expire-times: 10msend-frequency: 1msend-maximum-quantity-per-day: 10begin-code: 9999 # 这里配置 9999 的原因是,测试方便。end-code: 9999 # 这里配置 9999 的原因是,测试方便。trade:order:pay-expire-time: 2h # 支付的过期时间receive-expire-time: 14d # 收货的过期时间comment-expire-time: 7d # 评论的过期时间express:client: KD_NIAOkd-niao:api-key: cb022f1e-48f1-4c4a-a723-9001ac9676b8business-id: 1809751request-type: 1002 # 免费版 1002;付费版 8001kd100:key: pLXUGAwK5305customer: E77DF18BE109F454A5CD319E44BF5177file:upload-dir: /data/home/huangjiaqi/agent-saas/agent-saas-api/pictures # 文件上传存储路径max-size: 15MB # 单文件大小限制allowed-types: image/jpeg,image/png,image/gif # 允许的文件类型
关键配置说明:
-
upload-dir
: 文件存储的服务器绝对路径 -
max-size
: 限制上传文件大小(示例为15MB) -
allowed-types
: 限制可上传的文件类型
二、上传代码
@Tag(name = "文件上传")
@RestController
@RequestMapping("/admin-api/file")
public class FileUploadController {@Value("${yudao.file.upload-dir}")private String uploadDir;@PostMapping("/upload")@Operation(summary = "单文件上传")@PermitAllpublic AjaxResult uploadFile(@RequestParam("file") MultipartFile file) {try {// 1. 校验文件if (file.isEmpty()) {return AjaxResult.error("文件不能为空");}if (file.getSize() > 15 * 1024 * 1024) {return AjaxResult.error("文件大小不能超过15MB");}// 2. 调用工具类上传String filePath = FileUploadUtil.upload(file, uploadDir);// 3. 解析文件信息String originalFilename = file.getOriginalFilename();String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));String newFileName = filePath.substring(filePath.lastIndexOf("/") + 1);// 4. 从uploadDir中提取相对路径部分// 假设uploadDir是绝对路径,我们需要获取最后一个目录名// 例如:/data/home/huangjiaqi/agent-saas/agent-saas-api/pictures → 获取 "pictures"String relativePath = uploadDir.substring(uploadDir.lastIndexOf("/") + 1);// 5. 构建返回结果Map<String, Object> map = new HashMap<>();map.put("fileUrl", "/" + relativePath + filePath); // 完整相对路径map.put("originalSize", file.getSize());map.put("fileSuffix", fileSuffix); // 文件后缀(如 ".png")map.put("newFileName", newFileName); // 新文件名(带后缀)map.put("originalName", originalFilename); // 原文件名return AjaxResult.success(map);} catch (Exception e) {return AjaxResult.error("上传失败:" + e.getMessage());}}
}
三、成功响应示例
{"msg": "操作成功","code": 0,"data": {"originalName": "美女0005.png","fileSuffix": ".jepg","newFileName": "202506060950488009.jpeg","fileUrl": "/pictures/2025/06/202506060950488009.jpeg","originalSize": 231422}
}
四、关键点说明
-
路径处理:
-
存储路径使用绝对路径(如
/data/.../pictures
) -
访问路径使用相对路径(如
/pictures/...
)
-
提示:确保同时配置放行静态资源映射,使/pictures/**
能直接访问上传的文件