📒 阿里云 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.pswp.cn/bicheng/92671.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92671.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92671.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

get请求中文字符参数乱码问题

第一种方法 服务器默认的传参编码格式是ISO8859-1,所以前端直接原样字符串请求&#xff0c;到后端解析一下就得到正确字符 String fileName request.getParameter("fileName"); fileName new String(fileName.getBytes("ISO8859-1"),"UTF-8");…

C语言(10)——结构体、联合体、枚举

关于C语言零基础学习知识&#xff0c;小编有话说&#xff0c;各位看官敬请入下面的专栏世界&#xff1a;打怪升级之路——C语言之路_ankleless的博客-CSDN博客 Hi&#xff01;冒险者&#x1f60e;&#xff0c;欢迎闯入 C 语言的奇幻异世界&#x1f30c;&#xff01; 我是 Ankle…

海康威视摄像头实时推流到阿里云公网服务器(Windows + FFmpeg + nginx-rtmp)

海康威视摄像头实时推流到阿里云公网服务器&#xff08;Windows FFmpeg nginx-rtmp1. 步骤总览2. 阿里云 ECS&#xff08;Linux&#xff09;配置2.1 开放端口2.2 安装 nginx-rtmp3. Windows 电脑端配置3.1 安装 FFmpeg3.1.1 官网/镜像下载&#xff1a;3.1.2 解压后将 bin 目录…

基础网络网路层——IPV4地址

在IP网络上&#xff0c;如果用户要将一台计算机连接到Internet上&#xff0c;就需要向因特网服务提供方ISP&#xff08;Internet Service Provider&#xff09;申请一个IP地址。IP地址是在计算机网络中被用来唯一标识一台设备的一组数字。IPv4地址由32位二进制数值组成&#xf…

技术速递|GPT-5 正式上线 Azure AI Foundry

AI 应用正在经历一场深刻变革——对企业来说&#xff0c;仅仅“能聊天”早已不够&#xff0c;生成内容、逻辑推理、落地生产&#xff0c;这些才是新时代对 AI 能力的真正考验。 今天&#xff0c;我们非常激动地宣布&#xff0c;OpenAI 最新旗舰大模型 GPT-5 正式上线 Azure AI …

Logistic Regression|逻辑回归

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

三极管在电路中的应用

1、信号放大&#xff08;电压放大&#xff09; 应用场景 &#xff1a;麦克风声音放大、耳机驱动、广播信号接收等音频设备 原理解析 &#xff1a; 想象三极管如同一个精准的水龙头&#xff1a; 基极&#xff08;B&#xff09;电流如同拧动阀门的微弱力量&#xff08;输入信号&a…

Redis 事务机制

文章目录一、什么是事务&#xff1f;二、事务相关操作总体认识基本操作流程watch 操作演示watch 原理一、什么是事务&#xff1f; Redis 的事务和 MySQL 的事务概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执⾏. Redis 的事务和 MySQL 事务的区别&#xff1…

Mybatis学习之自定义映射resultMap(七)

这里写目录标题一、准备工作1、新建maven工程2、准备两张表3、建立mapper、pojo、映射文件mapper接口pojoxxxMapper.xml二、resultMap处理字段和属性的映射关系1、用起别名的方式保证字段名与属性名一致2、逐一设置resultMap映射关系3、配置mapUnderscoreToCamelCase三、多对一…

数学学习 | 高数、线代、概率论及数理统计荐书

注&#xff1a;本文为 “数学学习书目推荐” 相关合辑。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 高等数学、线性代数及概率论与数理统计领域推荐书目 西湖边的卡夫卡 编辑于 2023-09-19 13:26 7495 人赞同了该回答 数学具有内在的美学属性&#xff0c;但并非…

【LLM实战|langgraph】langgrpah基础

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 langgraph 基础 1. Chatbot实现 # !pip install langchain # !pip install langgraphfrom typing import Annotatedfrom typing_extensions import Typ…

大疆无人机使用eport连接Jetson主板实现目标检测

所需硬件设备如下&#xff1a; 实现原理&#xff1a; 视频流获取&#xff1a;从大疆无人机获取实时视频流。数据传输&#xff1a;将视频流传输至 Jetson 平台。目标检测处理&#xff1a;在 Jetson 上运行目标检测算法对传入的视频帧进行分析 EPort开发套件 大疆官网给出了…

Typora激活与使用

Typora下载 下载地址&#xff1a;Typora 官方中文站 Typora&#xff08;1.9.5及其以前的版本&#xff09; 工具&#xff1a;待补充 流程 1.解压工具 2.将license-gen.exe、node_inject.exe两个文件放于typora安装目录下 3.在typora安装目录下运行cmd&#xff08;可以打开…

图片拆分工具,自定义宫格切割

软件介绍 今天推荐一款实用的图像处理工具——lmage Splitter&#xff0c;支持图像拆分与格式互转功能&#xff0c;无广告干扰&#xff0c;操作简单流畅&#xff0c;满足多样化图片编辑需求。 软件优势 该工具为绿色版设计&#xff0c;无需安装即可直接运行&#xff0c;下载…

23种设计模式解析--创建型模式

创建型模式&#xff08;造物主的智慧&#xff09; 单例模式 模式定义 单例模式&#xff08;Singleton&#xff09;确保一个类仅有一个实例&#xff0c;并提供该实例的全局访问点。核心思想是通过私有化构造函数和静态成员实现受控的对象创建。核心实现要点 私有构造函数&#x…

全面解析软件工程形式化说明技术

一、形式化说明技术概述&#xff1a;从模糊到精确的跨越 在软件工程的发展历程中&#xff0c;需求说明技术始终是确保软件系统成功开发的关键环节。从早期依赖自然语言的非形式化描述&#xff0c;到如今基于数学和逻辑的形式化方法&#xff0c;这一领域经历了从模糊到精确的深…

百度网盘自动启动如何关闭,关闭智能看图

#某度软件引起的奔溃#在日常办公中&#xff0c;有时候双击图片&#xff0c;会自动打开了某度的网盘&#xff0c;很奇怪莫名其妙的为什么会关闭网盘后又自动打开了。如何发现是某度的牛虻软件在搞鬼的&#xff1f;我右键图片&#xff0c;选择打开方式&#xff0c;发现有“智能看…

疏老师-python训练营-Day40训练和测试的规范写法

浙大疏锦行 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测…

【重磅发布】flutter_chen_keyboard -专注于键盘相关功能

flutter_chen_keyboard 一个功能强大且易于使用的 Flutter 键盘增强库&#xff0c;专为提升移动应用的键盘交互体验而设计。 &#x1f4d6; 库简介 flutter_chen_keyboard 是一个专注于键盘相关功能的 Flutter 工具库&#xff0c;旨在为开发者提供更流畅、更智能的键盘交互解决…

idea设置注释--带日期和作者和描述

最终效果 在File Header中添加如下内容&#xff1a; /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}&#xff1a;IDEA 里设置的用户名 ${DATE}&#xff1a;当前日期 ${TIME}&#xff1a;当前时间 可以加自定义变量&#xff0c;比如 ${DESCRI…