阿里云OSS文件上传完整实现方案

一、前言

阿里云对象存储服务(OSS)是一种海量、安全、低成本、高可靠的云存储服务。本文将详细介绍如何在Spring Boot项目中集成阿里云OSS实现文件上传功能。

二、准备工作

1. 获取OSS配置信息

在开始前,您需要准备以下OSS配置信息:

  • endpoint: OSS服务访问端点

  • access-key-id: 访问密钥ID

  • access-key-secret: 访问密钥

  • bucket-name: 存储空间名称

获取方法参考:阿里云OSS配置获取指南

三、项目集成

1. 添加Maven依赖

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

2. 配置application.yml

survey:alioss:endpoint: your-endpointaccess-key-id: your-access-key-idaccess-key-secret: your-access-key-secretbucket-name: your-bucket-name

四、核心代码实现

1. 属性配置类

@Component
@ConfigurationProperties(prefix = "survey.alioss")
@Data
public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;
}

2. OSS工具类

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;public String upload(byte[] bytes, String objectName) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {log.error("OSS异常: {}", oe.getMessage());} catch (ClientException ce) {log.error("客户端异常: {}", ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}// 构建文件访问URLString fileUrl = String.format("https://%s.%s/%s", bucketName, endpoint, objectName);log.info("文件上传到: {}", fileUrl);return fileUrl;}
}

3. 配置类

@Configuration
@Slf4j
public class OssConfiguration {@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {log.info("创建阿里云文件上传工具类对象");return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

4. 文件上传接口

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;@PostMapping("/upload")public Result<String> upload(MultipartFile file) {log.info("文件上传: {}", file.getOriginalFilename());try {String originalFileName = file.getOriginalFilename();String extension = originalFileName.substring(originalFileName.lastIndexOf("."));String objectName = UUID.randomUUID().toString() + extension;String filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败: {}", e.getMessage());return Result.error("文件上传失败");}}
}

五、功能说明

  1. 文件命名:使用UUID生成唯一文件名,避免文件名冲突

  2. 异常处理:捕获OSSException和ClientException,记录详细错误日志

  3. 资源释放:确保OSSClient在使用后被正确关闭

  4. URL生成:按照阿里云OSS规范生成文件访问URL

六、使用示例

前端可以通过表单提交文件到/common/upload接口,接口会返回文件的访问URL。

七、注意事项

  1. 确保阿里云OSS服务已开通

  2. AccessKey需要妥善保管,不要泄露

  3. 上传大文件时考虑使用分片上传

  4. 生产环境建议添加文件大小限制和类型检查

八、总结

本文详细介绍了Spring Boot集成阿里云OSS实现文件上传的完整方案,包括配置获取、工具类封装和接口实现。该方案具有以下优点:

  • 代码结构清晰,易于维护

  • 完善的异常处理机制

  • 可扩展性强,便于添加新功能

希望本文对您有所帮助,欢迎在评论区交流讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89040.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89040.shtml

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

相关文章

【软考--软件设计师】10.2 关系型数据库

10 模式分解 分解 模式分解:将一个关系模式分解为多个子模式 模式分解就是模式规范化的工具&#xff0c;模式分解使用无损连接和保持函数依赖来衡量模式分解后是否导致原有模式中部分信息丢失。 无损连接 保持函数依赖 11、事务管理 事务的ACID性质: (1)原子性(Atomicit…

python训练day44 预训练模型

预训练模型发展史 预训练模型的训练策略 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt# 设置中文字体支持 plt.rcParams["…

[论文阅读]MISSRce

论文title: MISSRec: Pre-training and Transferring Multi-modal Interest-aware Sequence Representation for Recommendation

Redis学习笔记——黑马点评 附近商铺到UV统计 完结

前言&#xff1a; 今天完结了Redis的所有实战篇。 学习收获&#xff1a; GEO数据结构&#xff1a; GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入对Geo的支持&#xff0c;存储、管理和操作地理空间数据的特殊数据结构&#xff0c;它能高效处…

【客户端排查】mac电脑怎么查看客户端的实时运行日志

先退出客户端&#xff1b;打开访达里的应用程序&#xff1b; 打开【显示包内容】&#xff1b; 找到MacOS 双击里面的终端程序&#xff1b; 双击后&#xff0c;客户端会自动启动&#xff0c;且可以在终端中查看客户端的实时日志啦~

HarmonyOS NEXT仓颉开发语言实战案例:健身App

各位好&#xff0c;今日分享一个健身app的首页&#xff1a; 这个页面看起比之前的案例要稍微复杂一些&#xff0c;主要在于顶部部分&#xff0c;有重叠的背景&#xff0c;还有偏移的部分。重叠布局可以使用Stack容器实现&#xff0c;超出容器范围的偏移可以使用负数间距来实现&…

TreeMap源码分析 红黑树

今天尝试刨一下TreeMap的祖坟。 底层结构对比 先来看一下与HashMap、LinkedHashMap和TreeMap的对比&#xff0c;同时就当是复习一下&#xff1a; HashMap使用数组存储数据&#xff0c;并使用单向链表结构存储hash冲突数据&#xff0c;同一个冲突桶中数据量大的时候&#xff…

华为云Flexus+DeepSeek征文|基于Dify构建拍照识题智能学习助手

华为云FlexusDeepSeek征文&#xff5c;基于Dify构建拍照识题智能学习助手 一、构建拍照识题智能学习助手前言二、构建拍照识题智能学习助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建拍照识题智能学习助手实战3.1 配置Dify环境3.2 配置Dify工具…

题解:CF2120E Lanes of Cars

根据贪心&#xff0c;不难想到每次会把最长队伍末尾的那辆车移动到最短队伍的末尾。但由于 k k k 的存在&#xff0c;会导致一些冗余移动的存在。设需要挪动 C C C 辆车&#xff0c;则怒气值可以表示为 f ( C ) k C f(C) kC f(C)kC&#xff0c;其中 f ( C ) f(C) f(C) 是…

Excel基础:选择和移动

本文演示Excel中基础的选择和移动操作&#xff0c;并在最后提供了一张思维导图&#xff0c;方便记忆。 文章目录 一、选择1.1 基础选择1.1.1 选择单个单元格1.1.2 选择连续范围 1.2 行列选择1.2.1 选择整行整列1.2.2 选择多行多列 1.3 全选1.3.1 全选所有单元格1.3.2 智能选择…

Java面试宝典:基础四

80. int vs Integer 维度intInteger类型基本数据类型(8种之一)包装类默认值0null应用场景性能敏感场景(计算密集)Web表单、ORM框架(区分null和0)特殊能力无提供工具方法(如parseInt())和常量(如MAX_VALUE)示例:

RabbitMQ + JMeter 深度集成指南:中间件性能优化全流程解析!

在 2025 年的数字化浪潮中&#xff0c;中间件性能直接决定系统的稳定性和用户体验&#xff0c;而 RabbitMQ 作为消息队列的“老大哥”&#xff0c;在分布式系统中扮演着关键角色。然而&#xff0c;高并发场景下&#xff0c;消息堆积、延迟激增等问题可能让系统不堪重负&#xf…

uniapp image引用本地图片不显示问题

1. uniapp image引用本地图片不显示问题 在uniapp 开发过程中采用image引入本地资源图片。 1.1. 相对路径和绝对路径问题 在UniApp中开发微信小程序时&#xff0c;引入图片时&#xff0c;相对路径和绝对路径可能会有一些差异。这差异主要涉及到小程序和UniApp框架的文件结构、…

论文阅读:arxiv 2025 ThinkSwitcher: When to Think Hard, When to Think Fast

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 ThinkSwitcher: When to Think Hard, When to Think Fast https://arxiv.org/pdf/2505.14183#page2.08 https://www.doubao.com/chat/10031179784579842 文章目录 速览一、…

智能体记忆原理-prompt设计

智能体记忆的管理与设计开发分为以下几步&#xff1a; 1.记忆的抽取&#xff1b; 2.记忆的存储&#xff1b; 3.记忆的搜索&#xff1b; 一、记忆抽取一&#xff1a; FACT_RETRIEVAL_PROMPT f"""你是一位个人信息整理助手&#xff0c;专门负责准确存储事实、用…

026 在线文档管理系统技术架构解析:基于 Spring Boot 的企业级文档管理平台

在线文档管理系统技术架构解析&#xff1a;基于Spring Boot的企业级文档管理平台 在企业数字化转型的进程中&#xff0c;高效的文档管理系统已成为提升协作效率的核心基础设施。本文将深入解析基于Spring Boot框架构建的在线文档管理系统&#xff0c;该系统整合公告信息管理、…

AWTK-MVVM的一些使用技巧总结(1)

在项目中用了一段时间的AWTK-MVVM框架&#xff0c;由于AWTK-MVVM本身的文档十分欠缺&#xff0c;自己经过一段时间的研究折腾出了几个技巧&#xff0c;在此记录总结。 用fscript启用传统UI代码 AWTK-MVVM里面重新设计了navigator机制&#xff0c;重定位了navigator_to的调用方…

openwrt使用quilt工具制作补丁

前言&#xff1a;简单聊一下为什么需要制作补丁&#xff0c;因为openwrt的编译是去下载很多组件放到dl目录下面&#xff0c;这些组件都是压缩包。如果我们要修改这些组件里面的源码&#xff0c;就需要对这些组件打pacth&#xff0c;也就是把我们的差异点在编译的时候合入到对应…

强化学习 (1)基本概念

grid-world example 一个由多个格子组成的二维网格 三种格子&#xff1a;accessible可通行的&#xff1b; forbidden禁止通行的&#xff1b; target目标 state状态 state是智能体相对于环境的状态&#xff08;情况&#xff09; 在grid-world example里&#xff0c;state指的…

【Typst】纵向时间轴

概述 6月10日实验了一个纵向时间轴排版效果&#xff0c;当时没有做成单独的模块&#xff0c;也存在一些Bug。 今天(6月29日)在原基础上进行了一些改进&#xff0c;并总结为模块。 目前暂时发布出来&#xff0c;可用&#xff0c;后续可能会进行大改。 使用案例 导入模块使用…