springboot集成华为云obs文件上传

426 阅读2分钟

前置条件

  1. 获取ak sk
    登录华为云-》统一身份认证服务-》用户-》安全设置-》新增访问密钥 image.png
  2. 获取endPoint
    访问:developer.huaweicloud.com/endpoint?OB… 查找自己obs服务对应区域的终端节点
  3. 创建桶
    华为云控制台搜索“对象存储服务”-》桶列表-》创建桶

集成代码

  1. pom.xml
<dependency>
    <groupId>com.huaweicloud</groupId>
    <artifactId>esdk-obs-java</artifactId>
    <version>3.21.8</version>
</dependency>

<!--
必须制定okhttp3的最新版本号,
否则会出现java.lang.NoSuchMethodError: okhttp3.RequestBody.create
-->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
</dependency>
<!--
必须指定与okhttp相匹配的okio的版本,否则会出现okio和okhttp的包冲突问题
java.lang.NoSuchMethodError: kotlin
-->
<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>2.8.0</version>
</dependency>
  1. config配置类
package com.dz.dao.config;

import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @ClassName ObsConfig
 * @Description: obs配置类
 * @Author: wu
 * @CreateDate: 2024/1/10 14:08
 */

@Data
@Configuration
@Slf4j
public class HweiOBSConfig {


    /**
     * 访问密钥AK
     */
    @Value("${hwyun.obs.accessKey}")
    private String accessKey;

    /**
     * 访问密钥SK
     */
    @Value("${hwyun.obs.securityKey}")
    private String securityKey;

    /**
     * 终端节点
     */
    @Value("${hwyun.obs.endPoint}")
    private String endPoint;

    /**
     * 桶
     */
    @Value("${hwyun.obs.bucketName}")
    private String bucketName;

    /**
     * @Description 获取OBS客户端实例
     * @return: com.obs.services.ObsClient
     */
    public ObsClient getInstance() {
        return new ObsClient(accessKey, securityKey, endPoint);
    }

    /**
     * @Description 销毁OBS客户端实例
     * @param: obsClient
     */
    public void destroy(ObsClient obsClient) {
        try {
            obsClient.close();
        } catch (ObsException e) {
            log.error("obs执行失败", e);
        } catch (Exception e) {
            log.error("执行失败", e);
        }
    }

    /**
     * @Description 微服务文件存放路径
     * @return: java.lang.String
     */
    public static String getObjectKey() {
        // 项目或者服务名称 + 日期存储方式
        return "files" + "/" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "/";
    }
}
  1. service实现类
 public String fileUpload(MultipartFile uploadFile, String fileName) {
        ObsClient obsClient = null;
        try {
            String bucketName = hweiOBSConfig.getBucketName();
            obsClient = hweiOBSConfig.getInstance();
            InputStream inputStream = uploadFile.getInputStream();
            long available = inputStream.available();
            PutObjectRequest request = new PutObjectRequest(bucketName, createUUidName(fileName), inputStream);

            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(available);
            request.setMetadata(objectMetadata);
            // 设置对象访问权限为公共读
            request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
            PutObjectResult result = obsClient.putObject(request);

            // 读取该已上传对象的URL
            log.info("已上传对象的URL" + result.getObjectUrl());
            return result.getObjectUrl();
        } catch (ObsException e) {
            log.error("obs[fileUpload]上传失败", e);
        } catch (IOException e) {
            log.error("[fileUpload]上传失败", e);
        } finally {
            hweiOBSConfig.destroy(obsClient);
        }
        return null;
    }
     /**
     * 创建随机的名
     * @param fileName
     * @return
     */
    private static String createUUidName(String fileName){
        //后缀
        String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
        String uuid = UUID.randomUUID().toString().replace("-", "");
         //文件全路径
        return HweiOBSConfig.getObjectKey()+uuid+System.currentTimeMillis() + "." + prefix;
    }
  1. controller调用
 @Autowired
    HwObsService hwObsService;
    @ApiOperation("文件上传")
    @PostMapping("upload")
    public R localUpload(MultipartFile file, HttpServletRequest request) throws IOException {
        String fileName = file.getOriginalFilename();
        return R.ok(hwObsService.fileUpload(file,fileName));

8.application.yml

hwyun:
  obs:
    #访问密钥AK
    accessKey: 通过华为云获取
    #访问密钥SK
    securityKey: 通过华为云获取
    #终端节点
    endPoint: 通过华为云获取
    #桶名
    bucketName: 通过华为云获取