library-picturebook-activity/oss-direct-upload-demo/backend/FileUploadController.java
En b9ed5e17c6 feat: OSS 客户端直传改造(STS Token 签发 + 前端直传 + CORS 自动配置)
后端新增 OssUtils/OssTokenVo/OssCorsInitRunner,通过 STS 临时凭证实现客户端直传 OSS;
前端 upload API 适配直传流程,赛事创建/作品提交/作业/富文本编辑器均已切换;
多环境(dev/test/prod) OSS 配置补全;新增 oss-direct-upload-demo 示例项目及 E2E 测试。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 15:19:43 +08:00

59 lines
1.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.example.oss.controller;
import com.example.oss.util.OssUtils;
import com.example.oss.vo.OssTokenVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* 文件上传控制器
* <p>
* 仅提供 OSS 直传 Token 获取接口。
* 实际文件上传由前端直接发送到阿里云 OSS不经过后端。
* </p>
*
* <h3>使用流程:</h3>
* <ol>
* <li>前端调用 GET /api/v1/files/oss/token 获取签名 Token</li>
* <li>前端使用 FormData 将文件 + Token 直接 POST 到阿里云 OSS</li>
* </ol>
*/
@RestController
@RequestMapping("/api/v1/files")
@RequiredArgsConstructor
@Tag(name = "文件上传")
public class FileUploadController {
private final OssUtils ossUtils;
/**
* 获取阿里云 OSS 直传 Token
* <p>
* 用于前端直传文件到 OSS无需经过后端中转
* </p>
*
* @param fileName 原始文件名(如:图片.jpg
* @param dir 目录前缀可选avatar, course/cover
* @return OSS 直传 Token VO
*/
@GetMapping("/oss/token")
@Operation(summary = "获取阿里云 OSS 直传 Token")
public Map<String, Object> getOssToken(
@RequestParam("fileName") String fileName,
@RequestParam(value = "dir", required = false) String dir) {
OssTokenVo token = ossUtils.generatePostObjectToken(fileName, dir);
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("message", "success");
result.put("data", token);
return result;
}
}