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

云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】

📒 阿里云 OSS + Spring Boot + 异步任务(直接存 OSS)

1. 项目结构

src/main/java/com/example/demo├── controller│     └── UploadController.java  // 接收上传请求├── service│     ├── AsyncUploadService.java // 异步上传逻辑│     └── OssService.java         // OSS 上传工具类└── DemoApplication.java          // 主启动类

2. Maven 依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

3. application.properties 配置

# 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博客

package 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 文件访问 URLreturn path;}
}

5 . 异步上传服务 AsyncUploadService.java

package 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 {@Autowiredprivate OssService ossService;/*** 异步上传文件到 OSS* @param file 上传的 MultipartFile* @param fileName 存储到 OSS 的文件名*/@Async // 异步执行,不阻塞主线程public void upload(MultipartFile file, String fileName) {try {// 直接通过 InputStream 上传到 OSSossService.uploadFile(file, fileName);System.out.println("文件异步上传完成:" + fileName);} catch (Exception e) {e.printStackTrace();// 这里可加失败重试机制}}
}

6. 控制器 UploadController.java

 
package 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();// 异步上传到 OSSasyncUploadService.upload(file, fileName);// 直接返回提示(上传可能还在进行中)return "文件已接收,正在后台上传到 OSS...";}
}


7. 启用异步任务

 
package 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);}
}


🔍 逻辑说明

  1. 用户上传文件 → 控制器接收 MultipartFile

  2. 生成唯一文件名(避免 OSS 覆盖旧文件)

  3. 异步执行上传@Async 标记的方法)

  4. 直接用 MultipartFile.getInputStream() 上传到 OSS(避免本地磁盘中转)

  5. 返回提示信息(上传还在后台进行)


📌 关键点

  • 使用 异步任务 避免上传过程阻塞 HTTP 请求

  • 使用 MultipartFile.getInputStream() 避免文件落地到本地磁盘

  • 生产环境可加 失败重试机制(例如 Spring Retry)

  • OSS Bucket 权限一般用 公共读 + 私有写

    • 公共读:用户可直接访问图片 URL

    • 私有写:只有服务器能写入,防止恶意上传

http://www.lryc.cn/news/615145.html

相关文章:

  • 81 keil仿真调试记录
  • C++11中的移动语义
  • 优化器:SGD、Adam、RMSprop等优化算法对比与机器翻译应用
  • day 16 stm32 IIC
  • 【Java EE初阶 --- 网络原理】JVM
  • 堆----3.数据流的中位数
  • 【Redis】Redis-plus-plus的安装与使用
  • 自定义通知组件跟随右侧边栏移动
  • SQL基本
  • 探索Trae:使用Trae CN爬取 Gitbook 电子书
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • 生态问题是什么?
  • P1890 gcd区间
  • 如何理解SA_RESTART”被信号中断的系统调用自动重启“?
  • SELinux 入门指南
  • ROS2 多线程 与组件机制
  • Python NumPy入门指南:数据处理科学计算的瑞士军刀
  • Qt 的对象线程亲和性规则
  • 华为欧拉OpenEnler系统在启动MindIE时权限问题的解决方法
  • 从灵感枯竭到批量产出:无忧秘书创作平台如何重构内容生产者的工作流程?全环节赋能分析
  • Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • kafka架构原理快速入门
  • AI大语言模型在生活场景中的应用日益广泛,主要包括四大类需求:文本处理、信息获取、决策支持和创意生成。
  • 软件定义车辆加速推进汽车电子技术
  • Blender 快捷键速查表 (Cheat Sheet)
  • 【线性代数】6二次型
  • 可直接运行的 Playwright C# 自动化模板
  • 通过 Certimate 统一管理 SSL 证书 支持自动化申请、全平台部署
  • 【线性代数】线性方程组与矩阵——(1)线性方程组与矩阵初步