1 创建华为云Bucket

1.1 创建Bucket

1.2 获取Bucket的Endpoint

1.3 获取访问凭证

 注:每个访问密钥仅能下载一次,为了账号安全性,建议您定期更换并妥善保存访问密钥。不再使用的访问密钥,建议停用和删除。

2 创建Sprint Boot工程

创建一个如下图所示的工程,其中common模块用于存在通过的工具、文件和类等;pojo模块用于存放实体、vo和dto;server模块则用于实现业务功能。

2.1 配置OBS参数

在server模块下,创建如下图所示的两个配置文件

在application-dev.yml配置文件中配置OBS参数,示例如下:

test:datasource:driver-class-name: com.mysql.cj.jdbc.Driver……此处省略其它配置内容……hwobs:endpoint: obs.cn-north-4.myhuaweicloud.comaccessKeyId: HP……………………G98accessKeySecret: aK………………………fiCbucketName: ptu……………………ut

注:以上hwobs中的各参数值要替换成自己的。

在application.yml配置文件中动态引用application-dev.yml配置文件中的内容,示例如下:

server:port: 8080spring:mvc:pathmatch:matching-strategy: ant_path_matcherprofiles:active: devmain:allow-circular-references: truedatasource:druid:driver-class-name: ${test.datasource.driver-class-name}……此处省略其它配置内容……hwobs:endpoint: ${test.hwobs.endpoint}accessKeyId: ${test.hwobs.accessKeyId}accessKeySecret: ${test.hwobs.accessKeySecret}bucketName: ${test.hwobs.bucketName}

2.2 添加HWOBS依赖

2.2.1 配置全局pom.xml文件

在全局pom.xml文件中添加Huawei OBS的SDK依赖

示例如下:

    <properties>……其它内容……<hw.sdk.obs>3.23.9</hw.sdk.obs>……其它内容……</properties><dependencyManagement><dependencies>……其它内容……<dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java-bundle</artifactId><version>${hw.sdk.obs}</version></dependency>……其它内容……</dependencies></dependencyManagement>

2.2.2 配置通用模块的pom.xml文件

配置通用模块common下的pom.xml

示例内容如下:

    <dependencies>……其它内容……<dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java-bundle</artifactId></dependency>……其它内容</dependencies>

2.3 创建HwObs的属性类

在common模块下的properties包中添加HwObsProperties属性类

文件内容示例如下:

package ptu.test.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "test.hwobs")
@Data
public class HwObsProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;
}

2.4 创建HwObsUtil工具类

在common模块下的utils包中添加HwObsUtil工具类

示例内容如下:

package ptu.test.utils;import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;import java.io.ByteArrayInputStream;
import java.io.IOException;@Data
@AllArgsConstructor
@Slf4j
public class HwObsUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @return*/public String upload(byte[] bytes, String objectName) {// 创建ObsClient实例// 使用配置文件中的accessKeyId, accessKeySecret初始化客户端ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endpoint);try {// 创建PutObject请求obsClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (ObsException e) {System.out.println("putObject failed");// 请求失败,打印http状态码System.out.println("HTTP Code:" + e.getResponseCode());// 请求失败,打印服务端错误码System.out.println("Error Code:" + e.getErrorCode());// 请求失败,打印详细错误信息System.out.println("Error Message:" + e.getErrorMessage());// 请求失败,打印请求idSystem.out.println("Request ID:" + e.getErrorRequestId());System.out.println("Host ID:" + e.getErrorHostId());e.printStackTrace();} finally {if (obsClient != null) {try {obsClient.close();} catch (IOException e) {throw new RuntimeException(e);}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}}
}

2.5 创建统一返回结果类

在common模块下的result包中创建Result类,用于统一返回结果

文件内容示例如下:

package ptu.test.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* @param <T>*/
@Data
public class Result<T> implements Serializable {private Integer code; //编码:1成功,0和其它数字为失败private String msg; //错误信息private T data; //数据public static <T> Result<T> success() {Result<T> result = new Result<T>();result.code = 1;return result;}public static <T> Result<T> success(T object) {Result<T> result = new Result<T>();result.data = object;result.code = 1;return result;}public static <T> Result<T> error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}}

2.6 创建ObsConfiguration类

在需要文件上传的server模块,创建一个config包,并在其中创建一个ObsConfiguration类

示例内容如下:

package ptu.test.config;import ptu.test.properties.HwObsProperties;
import ptu.test.utils.HwObsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 自定义配置类,用于创建HwObsUtil 对象*/
@Configuration
@Slf4j
public class ObsConfiguration {@Bean@ConditionalOnMissingBeanpublic HwObsUtil hwObsUtil(HwObsProperties hwObsProperties) {//log.info("创建华为云文件上传工具类对象:{}", hwObsProperties);return new HwObsUtil(hwObsProperties.getEndpoint(),hwObsProperties.getAccessKeyId(),hwObsProperties.getAccessKeySecret(),hwObsProperties.getBucketName());}
}

2.7 实现文件上传

在server模块下的controller包下创建CommonController类

实现上传文件的示例代码如下:

package ptu.test.controller;import ptu.test.constant.MessageConstant;
import ptu.test.result.Result;
//import com.sky.utils.AliOssUtil;
import ptu.test.utils.HwObsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.UUID;/*** 通用控制类*/
@RestController
@RequestMapping("/admin/common")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {@Autowiredprivate HwObsUtil hwObsUtil;/*** 文件上传至华为云* @param file* @return*/@PostMapping("upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file) {log.info("上传文件:{}", file);// 获取原始文件名String originalFilename = file.getOriginalFilename();// 获取原始文件的扩展名String extension = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成带UUID的新文件名String objectName = UUID.randomUUID().toString() + extension;//上传文件,并获取新文件的访问路径try {String filePath = hwObsUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败:{}", e.getMessage());}return Result.error("文件上传失败");}
}

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

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

相关文章

使用驱动移除内核回调,

https://br-sn.github.io/Removing-Kernel-Callbacks-Using-Signed-Drivers/ 原创 大蓝 RJ45实验室 使用签名驱动移除内核回调-安全KER - 安全资讯平台 介绍 创建该PoC的目的是了解驱动漏洞利用程序的强大功能&#xff0c;以及EDR如何使用内核回调以防止恶意软件的攻击。…

从零搭建Cloud Alibaba (下) Sentinel篇

1.Sentinel控制台的安装 下载地址&#xff1a; Releases alibaba/Sentinelx 下载后是一个jar包 进入目录 CMD命令 java -jar "sentinel-dashboard-1.8.8 .jar" 如果发生了端口冲突则使用以下命令启动 修改端口号为8090 java -Dserver.port8090 -jar "sen…

Numpy科学计算与数据分析:Numpy数学函数入门与实践

Numpy数学函数实战&#xff1a;探索数学运算的无限可能 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy中常用的数学函数&#xff0c;包括三角函数、指数函数和对数函数的使用方法&#xff0c;以及如何利用这些函数对数组进行高效的数学运算。本课程不仅会讲解理论知识…

BIGO Ads是什么?BIGO广告营销核心玩法解析

在全球化竞争白热化的当下&#xff0c;BIGO Ads凭借其覆盖150国家的庞大流量池和AI驱动的精准营销能力&#xff0c;已成为出海企业突破增长瓶颈的利器。2025年Q1数据显示&#xff0c;BIGO Ads广告业务同比增长27%&#xff0c;非直播收入占比达24.9%&#xff0c;成为欢聚集团第二…

人工智能领域、图欧科技、IMYAI智能助手2025年3月更新月报

2025年3月AI领域重要技术进展与平台更新概览 2025年3月&#xff0c;人工智能领域迎来一系列重要技术更新与平台功能迭代&#xff0c;尤其在多模态模型、图像生成编辑、视频生成、大型语言模型&#xff08;LLM&#xff09;性能提升等方面表现活跃。以下是对关键进展的梳理&#…

STM32HAL 快速入门(一):点灯前的准备 —— 从软件安装到硬件原理

前言 大家好&#xff0c;这里是 Hello_Embed。嵌入式开发的 “Hello World” 是点灯 —— 通过控制单片机引脚的高低电平&#xff0c;让 LED 亮灭。要实现这个功能&#xff0c;前期准备必不可少&#xff1a;从软件安装到硬件原理理解&#xff0c;每一步都很关键。本文就来详细说…

Python网络编程技术

一、网络编程基础概念 1.1 什么是网络编程&#xff1f; 定义&#xff1a;程序通过网络与其他程序进行通信的技术。核心目标&#xff1a;实现数据在不同主机或进程间的传输与交互。应用场景&#xff1a;Web服务、API调用、实时通信、分布式系统等。 1.2 网络通信模型 OSI七层…

基于PHP的快递管理系统的设计与实现

管理员&#xff1a;登录&#xff1a;管理员可以通过用户名和密码登录系统&#xff0c;进入管理员后台管理界面。个人中心&#xff1a;管理员可以查看和编辑个人信息&#xff0c;如姓名、联系方式等。用户管理&#xff1a;管理员可以管理系统中的用户信息&#xff0c;包括添加新…

WPF的C1FlexGrid的单元格回车换行输入

重写C1FlexGrid的按键事件PreviewKeyDown"flex_PreviewKeyUp" 定义按键方法private void flex_PreviewKeyUp(object sender, KeyEventArgs e){if (e.Key Key.Enter){// 获取当前编辑的单元格var cell CfgReviewItem.Selection;if (cell.Column > 0 && …

简单部署普罗米修斯(Promethus)与Grafana配置

环境信息&#xff1a;系统版本ubuntu2404k8s版本v1.22.2promethus节点IP192.168.31.210Grafana节点IP192.168.31.210node1节点IP192.168.31.214node2节点IP192.168.31.215部署Promethus&#xff08;https://prometheus.io/download/&#xff09; wget https://ghfast.top/https…

Redis 编译错误:缺少静态库文件,如何解决?

目录 一、问题背景 二、问题分析 三、解决方案&#xff1a;手动编译缺失依赖 四、重新编译 Redis 主程序 五、小结与补充建议 一、问题背景 在从源代码编译 Redis&#xff08;如 8.0.3 版本&#xff09;时&#xff0c;很多开发者可能会遇到如下错误信息&#xff1a; /us…

vscode+latex本地英文期刊环境配置

1、首先进行vscode的配置安装&#xff0c;这个网上很多教程直接安装就可以&#xff0c;我建议安装vscode就行&#xff08;https://code.visualstudio.com/Download&#xff09;&#xff0c;vs studio稍微有点复杂而且有点大没必要&#xff0c;单写论文和简单的代码编译&#xf…

8.6 CSS3rem布局

rem布局 rem &#xff08;font size of the root element&#xff09;是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位&#xff0c;em&#xff08;font size of the element&#xff09;是指相对于父元素的字体大小的单位。它们之…

第十五章、非合作关系设定下的多智能体强化学习

0 前言 根据上一章的内容&#xff0c;已知完全合作关系下的多智能体利益一致有相同的目标&#xff0c;而非合作关系下实际上智能体的奖励和回报都是不一样的&#xff0c;它们都在努力让自己的利益最大化而并不考虑整体利益。 1 非合作关系设定下的策略学习要注意的点&#xff1…

分布式微服务--GateWay(过滤器及使用Gateway注意点)

前言、Spring Cloud Gateway 与 Web 依赖冲突 <!-- 下面两个依赖不能同时使用 --><!-- Gateway 组件 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><ve…

latex in overleaf快速通关论文排版

文章目录 0 有效连接汇总 1 简介 1.1 latex是什么 1.2 overleaf是什么? 2 快速上手 步骤1 注册 步骤2 使用 (1) 找模板 (2) 整体论文的overleaf结构 (3) 编辑内容 打开可视化编辑 实时编译 编辑 (4) 导出 3 常规操作 3.1 公式 3.2 表格 3.3 图片 3.4 引用 3.5 代码块 3.6 设置…

OO SALV的栏位功能

SALV的栏位功能主要是通过CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE这两个类的实现的。 SALV的栏位属性的详细功能包括异常状态图标、图标、符号、复选框、按钮、热点、超链接、单元格类型、单元格颜色、某一栏位颜色、某一行颜色&#xff0c;栏位隐藏等。关于颜色等样式属…

第2章:建模篇——第1节:点线面的选择与控制

目录 1.模式的切换 &#xff08;1&#xff09;编辑模式的切换 &#xff08;2&#xff09;点线面的切换 2.点线面的选择 &#xff08;1&#xff09;选择的设置 &#xff08;2&#xff09;循环选择 3.点线面的控制 4.总结 1.模式的切换 &#xff08;1&#xff09;编辑模…

深入解析嵌套事务:原理与应用

嵌套事务是指在事务执行过程中启动另一个事务形成的层级调用结构&#xff0c;主要用于处理跨服务或复杂业务场景的事务一致性控制。其核心是通过事务传播机制管理多个操作的原子性&#xff0c;具体原理和应用如下&#xff1a;一、核心概念与工作原理层级结构 嵌套事务由顶层事务…

[激光原理与应用-168]:测量仪器 - 对光学指标进行测量的仪器

一、基础光学参数测量仪器 - 频率/波长/功率光学显微镜用途&#xff1a;观察微小物体的显微图像&#xff0c;用于材料科学、生物学等领域。特点&#xff1a;高放大倍数和分辨率&#xff0c;可清晰显示微观结构。光谱分析仪用途&#xff1a;测量发光体的辐射光谱&#xff0c;分析…