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

springboot实现文件上传到华为云的obs

一、前言
有时在项目中需要使用一些存储系统来存储文件,那么当项目要接入obs作为存储系统时,就会利用obs来进行文件的上传下载,具体实现如下。

二、如何通过obs实现文件的上传下载?
1.添加相关的obs的maven依赖。

 <dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java-bundle</artifactId><version>3.23.9</version></dependency>

2.配置obs客户端连接。

@Configuration  
@Data
public class OBSConfig {  @Value("${obs.accessKey}")  private String accessKey;  @Value("${obs.secretKey}")  private String secretKey;  @Value("${obs.endpoint}")  private String endpoint;  @Value("${obs.bucket}")private String bucketName;}  

3.在YAML添加obs配置。

obs:endpoint: http://xxxxxx:xxxxaccessKey: xxxxxxxxsecretKey: xxxxxxxxxxxbucket: my-bucket

4.定义obs工具类,代码如下:

import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.CompleteMultipartUploadRequest;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.ObjectMetadata;
import com.obs.services.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.io.File;
import java.io.InputStream;
import java.util.UUID;@Component
public class ObsUtil {@Resourceprivate OBSConfig  oBSConfig;private ObsClient obsClient;public ObsClient getClient() {if (obsClient == null) {obsClient = new ObsClient(oBSConfig.getAccessKey, oBSConfig.getSecretKey, oBSConfig.getEndPoint);}return obsClient;}/*** 上传文件到OBS** @param file 待上传的文件* @return 返回文件的访问路径*/public String uploadFile(File file) {try (ObsClient obsClient = getObsClient()) {// 生成唯一的文件名String fileName = UUID.randomUUID().toString() + "-" + file.getName();PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);// 设置元数据(可选)ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType("application/octet-stream");putObjectRequest.setMetadata(metadata);obsClient.putObject(putObjectRequest);return endpoint + "/" + bucketName + "/" + fileName;} catch (ObsException e) {throw new RuntimeException("上传文件失败:" + e.getMessage(), e);}}/*** 上传文件流到OBS** @param inputStream 文件输入流* @param fileName    文件名* @return 返回文件的访问路径*/public String uploadInputStream(InputStream inputStream, String fileName) {try (ObsClient obsClient = getObsClient()) {// 生成唯一的文件名String objectKey = UUID.randomUUID().toString() + "-" + fileName;PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, inputStream);// 设置元数据(可选)ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType("application/octet-stream");putObjectRequest.setMetadata(metadata);obsClient.putObject(putObjectRequest);return endpoint + "/" + bucketName + "/" + objectKey;} catch (ObsException e) {throw new RuntimeException("上传文件流失败:" + e.getMessage(), e);}}/*** 下载文件** @param objectKey 对象键(文件名)* @param savePath  保存路径*/public Inputstream downloadFile(String objectKey, String savePath) {try (ObsClient obsClient = getObsClient()) {GetObjectRequest request = new GetObjectRequest();request.setBucketName(StringUtils.isEmpty(bucket) ? oBSConfig.getBucket : bucket);String objectName = (originFilePath == null ? "" : originFilePath) + fileName;objectName = objectName.charAt(0) == '/' ? objectName.substring(1) : objectName;request.setObjectKey(objectName);if (offset != null) {request.setRangeStart(offset);if (length != null) {request.setRangeEnd(offset + length);}}ObsObject object = client.getObject(request);return object.getObjectContent();} catch (ObsException e) {throw new RuntimeException("下载文件失败:" + e.getMessage(), e);}}/*** 删除文件** @param objectKey 对象键(文件名)*/public void deleteFile(String objectKey) {try (ObsClient obsClient = getObsClient()) {obsClient.deleteObject(bucketName, objectKey);} catch (ObsException e) {throw new RuntimeException("删除文件失败:" + e.getMessage(), e);}}
}

5.文件上传接口实现示例:

@RestController  
@RequestMapping("/obs")  
public class OBSUploadController {  @Autowired  private ObsUtil obsUtil ;  @PostMapping("/upload")  public ResponseEntity<String> uploadFile(  @RequestParam("file") MultipartFile file) {  try {  obsUtil.uploadFile(file.getInputStream(),"xxxx");  return ResponseEntity.ok("OBS路径: " + objectKey);  } catch (ObsException e) {  return ResponseEntity.status(e.getResponseCode())  .body("OBS服务异常: " + e.getErrorMessage());  } catch (Exception e) {  return ResponseEntity.internalServerError()  .body("上传失败: " + e.getMessage());  }  }  
}  

有兴趣的可以试一试。

相关文章:

springboot实现文件上传到华为云的obs

一、前言 有时在项目中需要使用一些存储系统来存储文件&#xff0c;那么当项目要接入obs作为存储系统时&#xff0c;就会利用obs来进行文件的上传下载&#xff0c;具体实现如下。 二、如何通过obs实现文件的上传下载&#xff1f; 1.添加相关的obs的maven依赖。 <dependency…...

南京布局产业园剖析:成都树莓集团的战略逻辑

在数字产业飞速发展的当下&#xff0c;成都树莓集团在南京布局产业园&#xff0c;这一举措蕴含着深刻的战略考量&#xff0c;是基于对市场环境、产业趋势以及自身发展需求的综合研判。 一、政策利好与发展机遇 南京作为长三角地区的重要城市&#xff0c;在数字经济发展方面享有…...

C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法

C QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法 记录一下 qmake .pro文件的配置 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compil…...

【算法】哈希表详解

【算法】哈希表详解 1. 哈希表的基本概念2. 哈希表的优缺点3. 哈希表的实现方法4. 哈希表的应用场景5. 哈希表的性能优化6. 哈希表 vs 其他数据结构7. 总结 哈希表&#xff08;Hash Table&#xff09; 是一种高效的数据结构&#xff0c;用于存储键值对&#xff08;Key-Value Pa…...

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署star-battle网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问star-battle网页小游戏五、总…...

【EB-06】SystemCreator dbc转arxml

SystemCreator dbc转arxml 1. SystemCreator 意义2. SystemCreator使用方法2.1 实现步骤2.2 参考官方文档方法1. SystemCreator 意义 EB Tresos 对dbc直接导入的支持不是很完善,dbc也不是AUTOSAR标准的数据库文件,EB建议所有通信矩阵通过ARXML交互比较合理(AUTOSAR定义的)…...

(0)阿里云大模型ACP-考试回忆

这两天通过了阿里云大模型ACP考试&#xff0c;由于之前在网上没有找到真题&#xff0c;导致第一次考试没有过&#xff0c;后面又重新学习了一遍文档才顺利通过考试&#xff0c;这两次考试内容感觉考试题目90%内容是覆盖的&#xff0c;后面准备分享一下每一章的考题&#xff0c;…...

按键精灵鹰眼中控:ios多设备管理工具

在当今数字化时代&#xff0c;高效管理多设备已成为许多企业和个人的迫切需求。无论是游戏多开、自动化测试&#xff0c;还是电商运营&#xff0c;如何同时操作多台设备并确保精准执行&#xff0c;一直是一个难题。现在&#xff0c;按键精灵的鹰眼群控功能为您提供了完美的解决…...

__对于初学者的CCS 汉化

IDE&#xff1a;Code Composer Studio 20.0.2 CCS安装后默认是英文&#xff0c;目前最新的20版其Help工具栏是没有安装软件包的选项。不过&#xff0c;想要汉化还有更简单的方法 安装插件 在左边找到扩展&#xff0c;然后在框内搜索Chinese&#xff0c;可以找到两个语言插件&am…...

JavaScript 系列之:Ajax、Promise、Axios

前言 同步&#xff1a;会阻塞。同步代码按照编写的顺序逐行依次执行&#xff0c;只有当前的任务完成后&#xff0c;才会执行下一个任务。 异步&#xff1a;异步代码不会阻塞后续代码的执行。当遇到异步操作时&#xff0c;JavaScript 会将该操作放入任务队列中&#xff0c;继续…...

Vidma Ver.2.14.0 高级版

Vidma Ver.2.14.0 高级版 Vidma 是一款易于使用的视频编辑器&#xff0c;提供多种音乐和流行视频效果选择&#xff0c;让您的视频在社交媒体上脱颖而出。您可以通过添加 swooshing 文本、流行效果、复古滤镜、精美贴纸、平滑过渡等等&#xff0c;轻松地从您的宝贵时刻创建有意…...

Redis Lua Script 溢出漏洞(CVE-2024-31449)

目录 漏洞描述 目前受影响的Redis版本&#xff1a; 安全版本 解决建议 升级Redis版本 查看旧redis版本信息 备份Redis数据 1.查看目前redis的key 2.备份数据 3.查看备份文件地址 4.将旧Redis安装目录备份 安装新版本Redis 1.下载redis安装包 2.安装redis 3.启动…...

【Mysql】我在广州学Mysql 系列—— 性能优化相关例题

ℹ️大家好&#xff0c;我是练小杰&#xff0c;时间过得真快&#xff0c;还有2天&#xff0c;2025年2月份就结束了&#xff01;&#xff01;&#x1f606; 本文是针对Mysql数据库中有关性能优化的相关示例&#xff0c;通过本文的学习可以深入了解性能优化的各类命令&#xff01…...

java23种设计模式-中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;学习笔记 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...

鸿蒙next 点击穿透实现

点击穿透可以参考华为开发的保留文章,该章节只能在developer preview版本下查看 点击穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…...

OpenAPI Generator:API开发的瑞士军刀

一、工具介绍 OpenAPI Generator是基于OpenAPI规范(Swagger)的代码生成工具&#xff0c;支持50种编程语言的客户端/服务端代码生成。其核心价值在于&#xff1a; 自动化生成⇒减少重复劳动规范API开发流程 核心能力矩阵&#xff1a; 功能支持示例客户端SDK生成Java/Python/T…...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要&#xff1a;纯电动商用车的工作环境存在路况复杂、工况恶劣等情况&#xff0c;导致整车电气设备的磨损速率加快&#xff0c;造成电气设备绝缘电阻持续下降&#xff0c;如不及时处理&#xff0c;可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…...

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…...

2025面试Go真题第一场

前几天参加了一场面试&#xff0c;GoLang 后端工程师&#xff0c;他们直接给了我 10 道题&#xff0c;我留了一个截图。 在看答案之前&#xff0c;你可以先简单做一下&#xff0c;下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…...

Nginx-UI 终极安装指南:快速解决端口配置与访问问题

Nginx-UI 终极安装指南&#xff1a;快速解决端口配置与访问问题 【免费下载链接】nginx-ui Yet another WebUI for Nginx 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui Nginx-UI 是一个基于 Go 和 Vue 开发的现代化 Nginx 图形化管理工具&#xff0c;为运维人…...

解密Minecraft源码:DecompilerMC反编译工具完整指南

解密Minecraft源码&#xff1a;DecompilerMC反编译工具完整指南 【免费下载链接】DecompilerMC This repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script or th…...

HunyuanVideo-Foley入门必看:音频质量客观指标(PESQ/STOI)实测报告

HunyuanVideo-Foley入门必看&#xff1a;音频质量客观指标&#xff08;PESQ/STOI&#xff09;实测报告 1. 引言 在音视频生成领域&#xff0c;音频质量评估一直是开发者关注的重点。HunyuanVideo-Foley作为一款集视频生成与音效生成于一体的AI工具&#xff0c;其音频输出质量…...

从零到一:用ThingsCloud零代码打造专属智能家居控制中心

1. 为什么选择ThingsCloud打造智能家居控制中心 第一次接触智能家居控制系统时&#xff0c;我被各种复杂的开发环境吓到了。作为一个没有任何编程基础的小白&#xff0c;光是配置开发环境就折腾了好几天。直到发现ThingsCloud这个神器&#xff0c;我才明白原来搭建智能家居控制…...

Starward米家游戏启动器:3分钟快速上手,告别繁琐游戏管理

Starward米家游戏启动器&#xff1a;3分钟快速上手&#xff0c;告别繁琐游戏管理 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward 还在为管理多个米哈游游戏而烦恼吗&#xff1f;每次都要打…...

Claude Code Harness架构技术深度解析:生产级AI Agent工程化实践

技术分析&#xff1a;基于泄露源码的Claude Code Harness设计原理与工程实现细节 前言&#xff1a;AI Agent工程化的技术挑战 2026年&#xff0c;Claude Code源代码泄露事件揭示了Anthropic在AI Agent工程化方面的深度技术积累。本文基于泄露的TypeScript源码&#xff0c;从技…...

ESP32-S3 + INMP441麦克风没声音?手把手教你用Arduino I2S库快速诊断(附完整代码)

ESP32-S3与INMP441麦克风无声故障全排查指南 当你兴奋地将INMP441麦克风焊接到ESP32-S3开发板&#xff0c;准备开始音频采集项目时&#xff0c;却发现设备一片寂静——这种挫败感我深有体会。去年在开发智能语音门锁原型时&#xff0c;我曾连续三天被这个看似简单的问题困扰。本…...

千问3.5-9B人工智能导论教学案例:直观理解AI工作流程

千问3.5-9B人工智能导论教学案例&#xff1a;直观理解AI工作流程 1. 初识AI工作流程 人工智能听起来很高深&#xff0c;但其实它的工作流程和我们日常解决问题的方式很像。想象一下&#xff0c;当你遇到一个数学题时&#xff0c;首先会读题目&#xff08;输入&#xff09;&am…...

自顶向下语法分析实战:从理论到LL(1)文法解析

1. 自顶向下语法分析入门指南 第一次接触自顶向下语法分析时&#xff0c;我完全被那些专业术语搞晕了。后来在实际项目中反复使用才发现&#xff0c;它其实就是一种"从整体到局部"的思考方式&#xff0c;就像我们读文章时先看目录再细读章节一样。这种分析方法特别适…...

Chainlit+Qwen1.5-1.8B-GPTQ-Int4构建私有AI助手:支持文件上传与内容问答教程

ChainlitQwen1.5-1.8B-GPTQ-Int4构建私有AI助手&#xff1a;支持文件上传与内容问答教程 1. 学习目标与前置准备 今天我们来学习如何搭建一个功能强大的私有AI助手&#xff0c;这个助手不仅能进行智能对话&#xff0c;还能读取你上传的文件并回答相关问题。想象一下&#xff…...