diff --git a/pom.xml b/pom.xml
index 6f815ab..1c6ccd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -125,6 +125,13 @@
spring-boot-starter-test
test
+
+
+ org.dromara.x-file-storage
+ x-file-storage-spring
+ 2.3.0
+
+
diff --git a/src/main/java/com/yupi/springbootinit/controller/FileController.java b/src/main/java/com/yupi/springbootinit/controller/FileController.java
new file mode 100644
index 0000000..5618df2
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/controller/FileController.java
@@ -0,0 +1,33 @@
+package com.yupi.springbootinit.controller;
+
+/*
+ * @author: ziin
+ * @date: 2025/8/25 13:36
+ */
+
+import com.yupi.springbootinit.common.BaseResponse;
+import com.yupi.springbootinit.common.ResultUtils;
+import com.yupi.springbootinit.service.ServerAiLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/log")
+@Slf4j
+@CrossOrigin
+public class FileController {
+
+ @Resource
+ private ServerAiLogService serverAiLogService;
+
+ @PostMapping("upload")
+ public BaseResponse upload(@RequestParam("file") MultipartFile file,
+ @RequestParam Long tenantId,
+ @RequestParam Long userId) {
+ return ResultUtils.success(serverAiLogService.saveLog(file,tenantId,userId));
+
+ }
+}
diff --git a/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java b/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java
new file mode 100644
index 0000000..f5aee03
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java
@@ -0,0 +1,12 @@
+package com.yupi.springbootinit.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yupi.springbootinit.model.entity.ServerAiLog;
+
+/*
+* @author: ziin
+* @date: 2025/8/25 13:37
+*/
+
+public interface ServerAiLogMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java b/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java
new file mode 100644
index 0000000..30945c2
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java
@@ -0,0 +1,32 @@
+package com.yupi.springbootinit.model.dto.file;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/*
+ * @author: ziin
+ * @date: 2025/8/25 14:32
+ */
+@Data
+public class FileDTO {
+ /**
+ * 日志租户
+ */
+ @TableField(value = "log_tenant_id")
+ @ApiModelProperty(value="日志租户")
+ private Long logTenantId;
+
+ /**
+ * 用户 Id
+ */
+ @TableField(value = "log_user_id")
+ @ApiModelProperty(value="用户 Id")
+ private Long logUserId;
+
+ @ApiModelProperty(value="日志文件")
+ private MultipartFile file;
+}
diff --git a/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java b/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java
new file mode 100644
index 0000000..2706e6e
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java
@@ -0,0 +1,71 @@
+package com.yupi.springbootinit.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import lombok.Data;
+
+/*
+* @author: ziin
+* @date: 2025/8/25 13:37
+*/
+
+@ApiModel(description="server_ai_log")
+@Data
+@TableName(value = "server_ai_log")
+public class ServerAiLog {
+ /**
+ * 日志主键
+ */
+ @TableId(value = "log_id", type = IdType.AUTO)
+ @ApiModelProperty(value="日志主键")
+ private Long logId;
+
+ /**
+ * 日志主键
+ */
+ @TableField(value = "log_name")
+ @ApiModelProperty(value="日志主键")
+ private String logName;
+
+ /**
+ * 日志路径
+ */
+ @TableField(value = "log_file_path")
+ @ApiModelProperty(value="日志路径")
+ private String logFilePath;
+
+ /**
+ * 日志租户
+ */
+ @TableField(value = "log_tenant_id")
+ @ApiModelProperty(value="日志租户")
+ private Long logTenantId;
+
+ /**
+ * 用户 Id
+ */
+ @TableField(value = "log_user_id")
+ @ApiModelProperty(value="用户 Id")
+ private Long logUserId;
+
+ @TableField(value = "creator")
+ @ApiModelProperty(value="")
+ private String creator;
+
+ @TableField(value = "create_time")
+ @ApiModelProperty(value="")
+ private Date createTime;
+
+ @TableField(value = "updater")
+ @ApiModelProperty(value="")
+ private String updater;
+
+ @TableField(value = "update_time")
+ @ApiModelProperty(value="")
+ private Date updateTime;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java b/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java
new file mode 100644
index 0000000..4583f0c
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java
@@ -0,0 +1,15 @@
+package com.yupi.springbootinit.service;
+
+import com.yupi.springbootinit.model.entity.ServerAiLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+/*
+* @author: ziin
+* @date: 2025/8/25 13:37
+*/
+
+public interface ServerAiLogService extends IService{
+
+
+ Boolean saveLog(MultipartFile file, Long tenantId, Long userId);
+}
diff --git a/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java b/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java
new file mode 100644
index 0000000..c479d85
--- /dev/null
+++ b/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java
@@ -0,0 +1,70 @@
+package com.yupi.springbootinit.service.impl;
+
+import com.yupi.springbootinit.common.ErrorCode;
+import com.yupi.springbootinit.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yupi.springbootinit.mapper.ServerAiLogMapper;
+import com.yupi.springbootinit.model.entity.ServerAiLog;
+import com.yupi.springbootinit.service.ServerAiLogService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+/*
+* @author: ziin
+* @date: 2025/8/25 13:37
+*/
+
+@Service
+@Slf4j
+public class ServerAiLogServiceImpl extends ServiceImpl implements ServerAiLogService{
+
+ @Resource
+ private ServerAiLogMapper serverAiLogMapper;
+
+ @Value("${ai_log_path}")
+ private String basePath;
+
+ @Override
+ public Boolean saveLog(MultipartFile file, Long tenantId, Long userId) {
+
+ if (file.isEmpty()) {
+ throw new BusinessException(ErrorCode.SYSTEM_ERROR,"上传文件为空");
+ }
+ Path dir = Paths.get(basePath, tenantId.toString(), userId.toString());
+ if (!Files.exists(dir)) {
+ try {
+ Files.createDirectories(dir);
+ } catch (IOException e) {
+ throw new BusinessException(ErrorCode.SYSTEM_ERROR,"创建目录失败");
+ }
+ }
+ String originalFilename = file.getOriginalFilename();
+ Path target = dir.resolve(originalFilename);
+ try {
+ Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING);
+ log.info("文件名{},文件上传路径{},",originalFilename,target);
+ } catch (IOException e) {
+ throw new BusinessException(ErrorCode.SYSTEM_ERROR,"保存文件失败");
+ }
+ ServerAiLog log = new ServerAiLog();
+ log.setLogName(originalFilename);
+ log.setLogFilePath(target.toString());
+ log.setLogTenantId(tenantId);
+ log.setLogUserId(userId);
+ log.setCreator(String.valueOf(userId)); // 可替换为当前登录用户
+ return serverAiLogMapper.insert(log) == 1;
+
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 70858ec..1ec2cbc 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -109,4 +109,4 @@ sa-token:
md5:
salt: (-FhqvXO,wMz
-ai_log_path: /test/ai_log/
\ No newline at end of file
+ai_log_path: /test/ai_log
\ No newline at end of file
diff --git a/src/main/resources/mapper/ServerAiLogMapper.xml b/src/main/resources/mapper/ServerAiLogMapper.xml
new file mode 100644
index 0000000..8bce4af
--- /dev/null
+++ b/src/main/resources/mapper/ServerAiLogMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ log_id, log_name, log_file_path, log_tenant_id, log_user_id, creator, create_time,
+ updater, update_time
+
+
\ No newline at end of file
diff --git a/src/test/java/com/yupi/springbootinit/MainApplicationTests.java b/src/test/java/com/yupi/springbootinit/MainApplicationTests.java
index c1133bf..ddb130b 100644
--- a/src/test/java/com/yupi/springbootinit/MainApplicationTests.java
+++ b/src/test/java/com/yupi/springbootinit/MainApplicationTests.java
@@ -10,7 +10,8 @@ import org.springframework.boot.test.context.SpringBootTest;
* @from 编程导航知识星球
*/
@SpringBootTest
-class MainApplicationTests {
+class
+MainApplicationTests {
@Test
void contextLoads() {