| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package com.xuekairui.user.controller;
- import com.xuekairui.common.Result;
- import com.xuekairui.user.service.OssService;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.*;
- import org.springframework.web.multipart.MultipartFile;
- import java.io.IOException;
- import java.nio.file.Files;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.util.UUID;
- /**
- * 通用文件上传控制器
- * <ul>
- * <li>POST /api/upload — 本地存储(兼容旧版)</li>
- * <li>POST /api/upload/oss — 阿里云 OSS 存储,返回公网 URL</li>
- * </ul>
- */
- @Slf4j
- @RestController
- @RequestMapping("/api/upload")
- @RequiredArgsConstructor
- public class FileUploadController {
- private final OssService ossService;
- @Value("${upload.path:/opt/uploads}")
- private String uploadPath;
- /**
- * 上传单个文件(本地存储)
- * POST /api/upload
- * Body: multipart/form-data, field: file
- *
- * @return 文件访问相对路径
- */
- @PostMapping
- public Result<String> upload(@RequestParam("file") MultipartFile file) throws IOException {
- if (file.isEmpty()) {
- return Result.error(400, "文件不能为空");
- }
- // 确保目录存在
- Path dir = Paths.get(uploadPath);
- if (!Files.exists(dir)) {
- Files.createDirectories(dir);
- log.info("创建上传目录: {}", dir.toAbsolutePath());
- }
- // 生成唯一文件名(保留扩展名)
- String originalFilename = file.getOriginalFilename();
- String extension = "";
- if (originalFilename != null && originalFilename.contains(".")) {
- extension = originalFilename.substring(originalFilename.lastIndexOf("."));
- }
- String fileName = UUID.randomUUID().toString().replace("-", "") + extension;
- // 写入文件
- Path targetPath = dir.resolve(fileName);
- file.transferTo(targetPath.toFile());
- log.info("文件上传成功: {}", targetPath.toAbsolutePath());
- // 返回可访问的相对路径
- String fileUrl = "/opt/uploads/" + fileName;
- return Result.success(fileUrl);
- }
- /**
- * 上传文件到阿里云 OSS
- * POST /api/upload/oss
- * Body: multipart/form-data, field: file
- *
- * @return 可公开访问的 OSS 文件 URL
- */
- @PostMapping("/oss")
- public Result<String> uploadToOss(@RequestParam("file") MultipartFile file) {
- if (file.isEmpty()) {
- return Result.error(400, "文件不能为空");
- }
- String fileUrl = ossService.upload(file);
- return Result.success(fileUrl);
- }
- }
|