当前位置: 首页 > news >正文

芋道源码 - 本地文件上传配置与实现

一、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}
}

四、关键点说明

  1. 路径处理

    • 存储路径使用绝对路径(如 /data/.../pictures

    • 访问路径使用相对路径(如 /pictures/...

提示:确保同时配置放行静态资源映射,使/pictures/**能直接访问上传的文件

http://www.xdnf.cn/news/908767.html

相关文章:

  • 【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
  • 配置sudo免密却不生效的问题
  • 【图论 强连通分量】P1653 [USACO04DEC] Cow Ski Area G|普及+
  • for(;;) 和while(1) 的无限循环用法对比,优缺点说明
  • PHP:Web 开发的强大基石与未来展望
  • 给网站添加live2d看板娘
  • 当主观认知遇上机器逻辑:减少大模型工程化中的“主观性”模糊
  • WHAT - script type=“module“
  • 通过Spring AI框架搭建mcp服务端说明
  • 【Block总结】DBlock,结合膨胀空间注意模块(Di-SpAM)和频域模块Gated-FFN|即插即用|CVPR2025
  • FineReport模板认证找不到模板
  • pyarmor加密python程序
  • 【DAY41】简单CNN
  • 深入浅出Java ParallelStream:高效并行利器还是隐藏的陷阱?
  • 【使用conda】安装pytorch
  • python:基于pyside6的桌宠源码分享
  • java面试场景提题:
  • 全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学
  • 数字孪生:如同为现实世界打造的“克隆体”,解锁无限可能
  • RabbitMQ 队列模式
  • CRM管理软件的审批流程设计与优化:提升企业运营效率的关键策略
  • DLL动态库实现文件遍历功能(Windows编程)
  • 浅谈不同二分算法的查找情况
  • hot100 -- 8.二叉树系列
  • 3D Web轻量化引擎HOOPS Communicator的定制化能力全面解析
  • LlamaIndex 工作流简介以及基础工作流
  • Linux驱动:class_create、device_create
  • java面试场景题:电商平台中订单未⽀付过期如何实现⾃动关单
  • 本地部署企业邮箱,让企业办公更安全高效
  • 【51单片机】0. 基础软件安装