📒 阿里云 OSS + Spring Boot + 异步任务(直接存 OSS)
1. 项目结构
Swiftsrc/main/java/com/example/demo ├── controller │ └── UploadController.java // 接收上传请求 ├── service │ ├── AsyncUploadService.java // 异步上传逻辑 │ └── OssService.java // OSS 上传工具类 └── DemoApplication.java // 主启动类
2. Maven 依赖
XML<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.17.4</version> </dependency>
3. application.properties 配置
XML# OSS 配置 oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com #你的Endpoint(地域节点)点击Bucket 列表点击概览滑到下面就能看到 oss.access-key-id=你的AccessKeyId oss.access-key-secret=你的AccessKeySecret oss.bucket-name=你的BucketName oss.folder= images
4. OSS 上传工具类 OssService.java
oss上放置的资源分私有/公共读/公共读写,我们如果选择作为图片/文件服务器时,选择 公共读、私有写 ,每个文件可以单独选择读写权限,通过springboot代码创建文件权限默认和Bucket的一致,如果这句话不太理解可以去看笔者的这篇博客: 云服务器--阿里云OSS(1)【阿里云OSS简单介绍以及环境准备】-CSDN博客
javapackage com.example.demo.service; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @Service public class OssService { @Value("${oss.endpoint}") private String endpoint; @Value("${oss.access-key-id}") private String accessKeyId; @Value("${oss.access-key-secret}") private String accessKeySecret; @Value("${oss.bucket-name}") private String bucketName; @Value("${oss.folder}") private String folder; /** * 直接通过 MultipartFile 的输入流上传到 OSS */ public String uploadFile(MultipartFile file, String fileName) throws IOException { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件(不落地到磁盘) ossClient.putObject(bucketName, fileName, file.getInputStream()); ossClient.shutdown(); //endpoint.replace("https://", ""),endpoint会带有https://,会与前面的矛盾要去掉,endpoint中的https:// String path = "https://" + bucketName + "." + endpoint.replace("https://", "") + "/" folder + "/"+ fileName; //可以把路径保存到数据库中,前端就可以根据这个路径访问了 save(path); // 返回 OSS 文件访问 URL return path; } }
5 . 异步上传服务 AsyncUploadService.java
javapackage com.example.demo.service; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @Service public class AsyncUploadService { @Autowired private OssService ossService; /** * 异步上传文件到 OSS * @param file 上传的 MultipartFile * @param fileName 存储到 OSS 的文件名 */ @Async // 异步执行,不阻塞主线程 public void upload(MultipartFile file, String fileName) { try { // 直接通过 InputStream 上传到 OSS ossService.uploadFile(file, fileName); System.out.println("文件异步上传完成:" + fileName); } catch (Exception e) { e.printStackTrace(); // 这里可加失败重试机制 } } }6. 控制器 UploadController.java
javapackage com.example.demo.controller; import com.example.demo.service.AsyncUploadService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.UUID; @RestController @RequiredArgsConstructor public class UploadController { private final AsyncUploadService asyncUploadService; /** * 接收文件上传请求 */ @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { // 生成唯一文件名,避免重名覆盖 String fileName = UUID.randomUUID() + "-" + file.getOriginalFilename(); // 异步上传到 OSS asyncUploadService.upload(file, fileName); // 直接返回提示(上传可能还在进行中) return "文件已接收,正在后台上传到 OSS..."; } }
7. 启用异步任务
javapackage com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync // 开启 @Async 支持 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
🔍 逻辑说明
用户上传文件 → 控制器接收
MultipartFile生成唯一文件名(避免 OSS 覆盖旧文件)
异步执行上传 (
@Async标记的方法)直接用
MultipartFile.getInputStream()上传到 OSS(避免本地磁盘中转)返回提示信息(上传还在后台进行)
📌 关键点
使用 异步任务 避免上传过程阻塞 HTTP 请求
使用
MultipartFile.getInputStream()避免文件落地到本地磁盘生产环境可加 失败重试机制(例如 Spring Retry)
OSS Bucket 权限一般用
公共读 + 私有写
公共读:用户可直接访问图片 URL
私有写:只有服务器能写入,防止恶意上传
云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
你我约定有三2025-08-10 17:11
相关推荐
catoop2 小时前
Linux 自动清理临时文件配置数智大号2 小时前
超云发布R2425存储服务器:以全栈自研引领国产存储新方向亚林瓜子2 小时前
在amazon linux 2023上面通过Fedora 36软件仓库源安装tesseract5是专家不是砖家2 小时前
linux USB摄像头不停掉线问题yuanManGan2 小时前
走进Linux的世界:初识进程(Task)NiKo_W2 小时前
Linux UdpSocket的应用小马哥编程3 小时前
【软考架构】案例分析-瘦客户端C/S架构老黄编程3 小时前
09-ubuntu20.04 执行 apt update时报错,是因为官网已停止维护不再更新的缘故吗?Supernova_Jun3 小时前
ffmpeg图片转视频摇滚侠3 小时前
Spring Boot3零基础教程,Reactive-Stream 规范核心接口,笔记103