【华为云】SpringBoot + OBS 上传文件

本文介绍了如何在Java项目中通过Maven引入华为云OBSJavaSDK,提供上传文件、下载文件以及处理异常的方法,包括配置参数获取和OBS操作示例。

一.引入Maven依赖

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

二.代码实现


@Data
@Component
@RefreshScope
public class HuaWeiCloudObs {

    private static final Logger LOGGER = LoggerFactory.getLogger(HuaWeiCloudObs.class);

    @Value("${cloud.huawei.obs.accessKeyId}")
    private String AK;

    @Value("${cloud.huawei.obs.secretAccessKeyId}")
    private String SK;

    @Value("${cloud.huawei.obs.endPoint}")
    private String ENDPOINT;

    @Value("${cloud.huawei.obs.bucketName}")
    private String BUCKET_NAME;

    /**
     * OBS-上传文件
     *
     * @param objectKey 具体的文件名(含存储路径)
     * @param inputStream 输入流
     * @return PutObjectResult
     */
    public PutObjectResult uploadFile(String objectKey, InputStream inputStream) {
        ObsClient obsClient = null;
        PutObjectResult putObjectResult = null;
        try {
            obsClient = new ObsClient(AK, SK, ENDPOINT);
            putObjectResult = obsClient.putObject(BUCKET_NAME,objectKey, inputStream);
            LOGGER.info("上传文件PutObjectResult============" + putObjectResult);
        } catch (ObsException e) {
            printObsException(objectKey, e);
        } catch (Exception e) {
            LOGGER.error("OBS上传文件报错Exception===============" + e.getMessage());
        } finally {
            if (obsClient != null) {
                try {
                    // 关闭OBS连接
                    obsClient.close();
                } catch (IOException e) {
                    LOGGER.error("OBS关闭连接报错!===============" + e.getMessage());
                }
            }

        }
        return putObjectResult;
    }

    /**
     * OBS-上传文件
     *
     * @param objectKey 具体的文件名(含存储路径)
     * @param fileName 文件路径
     * @return PutObjectResult
     */
    public PutObjectResult uploadFile(String objectKey, String fileName) {
        ObsClient obsClient = null;
        PutObjectResult putObjectResult = null;
        try {
            obsClient = new ObsClient(AK, SK, ENDPOINT);
            putObjectResult = obsClient.putObject(BUCKET_NAME, objectKey, new File(fileName));
            LOGGER.info("上传文件PutObjectResult============" + putObjectResult);

        } catch (ObsException e) {
            printObsException(objectKey, e);
        } catch (Exception e) {
            LOGGER.error("OBS上传文件报错Exception===============" + e.getMessage());
        } finally {
            if (obsClient != null) {
                try {
                    // 关闭OBS连接
                    obsClient.close();
                } catch (IOException e) {
                    LOGGER.error("OBS关闭连接报错!===============" + e.getMessage());
                }
            }

        }
        return putObjectResult;
    }

    /**
     * OBS-下载文件(获取对象)
     *
     * @param objectKey 具体的文件名(含存储路径)
     * @return ObsObject
     */
    public ObsObject downloadFile(String objectKey) {

        ObsClient obsClient = null;
        ObsObject obsObject = null;

        try {

            obsClient = new ObsClient(AK, SK, ENDPOINT);
            obsObject = obsClient.getObject(BUCKET_NAME, objectKey);
            LOGGER.info("下载文件ObsObject============" + obsObject);

        } catch (ObsException e) {
            printObsException(objectKey, e);
        } catch (Exception e) {
            LOGGER.error("OBS下载文件报错Exception===============" + e.getMessage());
        } finally {

            if (obsClient != null) {
                try {
                    // 关闭OBS连接
                    obsClient.close();
                } catch (IOException e) {
                    LOGGER.error("OBS关闭连接报错!===============" + e.getMessage());
                }
            }

        }
        return obsObject;
    }

    /**
     * OBS-下载文件(流式下载)
     *
     * @param obsObject 下载文件信息
     * @return ByteArrayOutputStream
     */
    public static ByteArrayOutputStream convertOutputStream(ObsObject obsObject) {
        InputStream input = null;
        ByteArrayOutputStream bos = null;
        try {
            // 流式下载
            input = obsObject.getObjectContent();
            byte[] b = new byte[1024];
            bos = new ByteArrayOutputStream();
            int len;
            while ((len = input.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            LOGGER.info(new String(bos.toByteArray()));

            bos.close();
            input.close();

        } catch (Exception e) {
            LOGGER.error("OBS上传文件报错Exception===============" + e.getMessage());
        } finally {

            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    LOGGER.error("bos关闭连接失败===============" + e.getMessage());
                }
            }
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    LOGGER.error("input关闭连接失败===============" + e.getMessage());
                }
            }

        }
        return bos;
    }

    /**
     * OBS-打印错误信息
     *
     * @param objectKey 路径KEY
     * @param e 错误信息
     * @param action 操作
     * @return ByteArrayOutputStream
     */
    private static void printObsException(String objectKey, ObsException e) {
        LOGGER.info("OBS文件报错ObsException===============" + objectKey);
        LOGGER.info("ObsException e: ====" + e);
        LOGGER.info("Response Code: ====" + e.getResponseCode());
        LOGGER.info("Error Message: ====" + e.getErrorMessage());
        LOGGER.info("Error Code: =======" + e.getErrorCode());
        LOGGER.info("Request ID: =======" + e.getErrorRequestId());
        LOGGER.info("Host ID: ==========" + e.getErrorHostId());
    }

三.注意

1.具体的配置参数 请到华为云OBS控制台创建获取 

### 实现 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]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上善若水-学者至上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值