华为云对象存储obs文件上传

搭建华为云obs服务

  1. 开通obs服务
  2. 创建桶对象

注意:不用特地买资源包,学习使用的话按需付费即可【记得在自己的华为云账号充一点钱方便他自己扣费】

创建成功之后:

点击进去之后,就可以知道对我们的有用参数:

  • bucketName
  • endpoint

  1. Obs的访问秘钥【ak,sk】

找到个人中心的控制台部分

点击我的凭证 -> 访问密钥 -> 添加密钥,并把获取到的密钥下载下来【是一个表格格式,打开之后就可以获取到自己的Access Key Id和Secret Access Key这两个有用参数】

java实现文件上传


前面的部分做完之后算是搭建好了华为云obs服务

更多细节参考官方文档: SDK - java部分

接下来我们要做的是在java代码中如何实现文件上传

导入依赖

<!--导入华为云obs服务依赖-->
  <dependency>
      <groupId>com.huaweicloud</groupId>
      <artifactId>esdk-obs-java-bundle</artifactId>
      <version>3.21.11</version>
  </dependency>

搭建模块

创建对象存储文件上传的专门模块:ObsController, ObsService, ObsServiceImpl

实现逻辑

Controller层:

在obsController中写一个upload方法:

需要注意的点:

  • post请求
  • 接受参数必须是MultipartFile类型,注意此时的参数名是file,所以前端部分在传输文件的时候,需要给name属性是file且type=file,不然不能正确上传
  • 返回的data属性中是一个imgUrl, 也就是我们上传到华为云返给我们的url

Serviceimpl服务实现层:

此处为了避免硬编码的风格,我使用的是:

  • 定义一个obs.properties的配置文件
  • 创建一个ObsProperties.java的配置类把obs.properties的内容批量注入到对应的属性中

服务层实现逻辑:

  • 注意:如果我们是上传图片,文件等,最好是使用的是文件流的方式,官方文档给出的方法是new File(filename),但是我们不是上传的本地文件,我们是通过前端部分传回的文件且此时是file对象接受参数,使用文件流的方式更好
  • 注意拼接url【对照之前直接使用华为云obs图形化界面上传文件时给出的url进行对应的拼接】
    • url的拼接此时就是: https:// + 自己创建的桶对象名字 + 服务节点endpoint + 文件名

代码:

@Override
public String upload(MultipartFile file) {
    // 填写一些必要的信息
    String endPoint = obsProperties.getEndpoint();
    String ak = obsProperties.getAccessKey();
    String sk = obsProperties.getSecretKey();
    // 创建ObsClient实例
    ObsClient obsClient = new ObsClient(ak, sk, endPoint);
    try {
        // 获取文件流
        InputStream inputStream = file.getInputStream();
        String originalFilename = file.getOriginalFilename();
        // 根据年月日创建一个文件夹,方便管理图片信息
        String fileName = new DateTime().toString("yyyy/MM/dd") + UUID.randomUUID().toString().replace("-", "") + originalFilename;
        // 使用文件流的方式上传 -- 创建PutObject请求
        obsClient.putObject(obsProperties.getBucketName(), fileName, inputStream);
        // 返回图片地址进行保存
        // https://xianzeng.obs.cn-north-4.myhuaweicloud.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220908100029.jpg
        System.out.println("https://" + obsProperties.getBucketName() + "." + obsProperties.getEndpoint() + "/" + fileName);
        return "https://" + obsProperties.getBucketName() + "." + obsProperties.getEndpoint() + "/" + fileName;
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    } finally {
        if(obsClient != null) {
            try {
                obsClient.close(); // 关闭资源
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

测试

返回值是url,前端可以根据url直接渲染

### 实现 Spring Boot 中文件上传华为云 OBS 的方法 要在 Spring Boot 项目中实现文件上传华为云对象存储服务(OBS),可以按照以下方式完成配置和编码。 #### 配置依赖项 首先,在项目的 `pom.xml` 文件中引入必要的依赖库,包括 Huawei Cloud SDK 和其他支持的工具包: ```xml <dependency> <groupId>com.huaweicloud</groupId> <artifactId>huaweicloud-sdk-obs</artifactId> <version>3.0.17</version> </dependency> ``` 此版本号可能随时间更新,请确保使用最新稳定版[^1]。 #### 创建配置类 创建一个用于初始化 OBS 客户端的 Java 配置类。该类负责加载访问密钥和其他必要参数。 ```java import com.obs.services.ObsClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ObsConfig { @Bean public ObsClient obsClient() { String ak = "your-access-key"; // 替换为实际 AK String sk = "your-secret-key"; // 替换为实际 SK String endpoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 替换为目标区域 Endpoint return new ObsClient(ak, sk, endpoint); } } ``` 上述代码片段展示了如何通过硬编码的方式设置 Access Key (AK),Secret Key (SK) 及目标区域的 EndPoint 地址[^2]。 #### 编写控制器逻辑 接下来定义 RESTful API 控制器来处理前端发送过来的文件数据流并将其保存到指定 Bucket 下面去。 ```java import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileUploadController { private final ObsClient obsClient; @Autowired public FileUploadController(ObsClient obsClient){ this.obsClient = obsClient; } @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception{ try { InputStream inputStream = file.getInputStream(); String bucketName = "test-bucket"; String objectKey = file.getOriginalFilename(); obsClient.putObject(bucketName, objectKey, inputStream); return "File uploaded successfully!"; } catch (ObsException e){ throw new RuntimeException(e.getMessage(),e); } } } ``` 这里实现了 POST 请求接口 `/upload` 来接收 multipart/form-data 类型请求体中的单个文件字段,并调用 OBS SDK 方法 putObject 将其存入特定路径下[^3]。 #### 测试与验证 启动应用程序之后可以通过 Postman 或者 curl 命令测试这个功能是否正常工作。例如利用 curl 工具模拟提交表单如下所示: ```bash curl -X POST http://localhost:8080/upload \ -F 'file=@/path/to/local/file.txt' ``` 如果一切顺利的话应该会收到成功的响应消息 “File uploaded successfully!” 同时可以在对应的 OBS 存储空间里找到刚传上去的新文档[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MGCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值