使用OBS征服非结构化数据【玩转华为云】

举报
码乐 发表于 2025/10/31 09:22:25 2025/10/31
【摘要】 1 对象存储服务现状简介云厂商的存储产品类型分析,云厂商(如阿里云、AWS、华为云、腾讯云等)提供的存储产品主要分为三大类,针对不同场景设计: 存储类型 典型产示例 特点与适用场景 对象存储 (Object Storage)阿里云 OSS、AWS S3、华为云 OBS、腾讯云 COS ...

1 对象存储服务现状简介

云厂商的存储产品类型分析,

云厂商(如阿里云、AWS、华为云、腾讯云等)提供的存储产品主要分为三大类,针对不同场景设计:

  存储类型                   典型产示例                                特点与适用场景  
  对象存储 (Object Storage)阿里云 OSS、AWS S3、华为云 OBS、腾讯云 COS   海量、非结构化数据存储(如图片、视频、日志、备份)。
                                                                      - 高耐久性(11-12个9)、无限扩展。
                                                                      - RESTful API访问,支持CDN加速、生命周期管理。
                                                                      - 最常用类型,用户重点提到的OSS/S3/OBS均属此类。



  文件存储 (File Storage)    AWS EFS、阿里云 NAS、华为云 SFS Turbo			- NFS/SMB协议共享文件系统。
                                                                          - 多实例并发访问,如共享目录。
  块存储 (Block Storage)       AWS EBS、阿里云 云盘、华为云 EVS           - 块级访问,高IOPS、低延迟。
                                                                      - 用于云服务器磁盘、数据库。
  • 阿里云OSS、AWS S3、华为云OBS的比较

这三者均为对象存储,高度相似(OBS/OSS兼容S3 API,便于迁移),但在定价、区域、集成上有差异。

选S3(全球/生态);
选OSS(性价比/中国);
选OBS(华为生态/企业)。迁移工具丰富(如阿里/华为支持S3互导)。

2 使用Go华为云OBS

使用OBS结合GO语言的SDK实现非结构化数据如图片的CRUD等基本功能

前提:

注册华为云,创建OBS桶,获取AK/SK(控制台 > 我的凭证)。
安装SDK:

		go get github.com/huaweicloud/huaweicloud-sdk-go-obs/obs

		Endpoint:如https://obs.cn-north-4.myhuaweicloud.com(替换为你的区域)。

环境变量:

		export AccessKeyID=your_ak; export SecretAccessKey=your_sk

3 完整示例

完整代码示例(main.go):实现图片上传(字节/Base64)、读取(字节/Base64)、临时分享链接、CRUD(查询列表/更新覆盖/删除)。

    package main

    import (
        "bytes"
        "encoding/base64"
        "fmt"
        "io"
        "os"

        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
    )

    type ObsService struct {
        client *obs.ObsClient
        bucket string
    }

    func NewObsService(ak, sk, endpoint, bucket string) *ObsService {
        client, err := obs.New(ak, sk, endpoint)
        if err != nil {
            panic(err)
        }
        return &ObsService{client: client, bucket: bucket}
    }

    func (s *ObsService) Close() {
        s.client.Close()
    }
  1. 上传图片二进制字节

     func (s *ObsService) UploadBytes(key string, imageBytes []byte) error {
         input := &obs.PutObjectInput{
             Bucket: s.bucket,
             Key:    key,
             Body:   bytes.NewReader(imageBytes),
         }
         _, err := s.client.PutObject(input)
         return err
     }
    
  2. 上传Base64编码图片(自动解码)

     func (s *ObsService) UploadBase64(key string, base64Str string) error {
         data, err := base64.StdEncoding.DecodeString(base64Str)
         if err != nil {
             return err
         }
         return s.UploadBytes(key, data)
     }
    
  3. 读取图片为二进制字节

     func (s *ObsService) GetBytes(key string) ([]byte, error) {
         input := &obs.GetObjectInput{
             Bucket: s.bucket,
             Key:    key,
         }
         output, err := s.client.GetObject(input)
         if err != nil {
             return nil, err
         }
         defer output.Body.Close()
    
         buf := new(bytes.Buffer)
         _, err = io.Copy(buf, output.Body)
         return buf.Bytes(), err
     }
    
  4. 读取图片为Base64

       func (s *ObsService) GetBase64(key string) (string, error) {
           bytes, err := s.GetBytes(key)
           if err != nil {
               return "", err
           }
           return base64.StdEncoding.EncodeToString(bytes), nil
       }
    
  5. 生成图片临时分享链接(GET,过期时间秒)

     func (s *ObsService) GenerateTempUrl(key string, expires int) (string, error) {
         input := &obs.CreateSignedUrlInput{
             Method:  obs.HttpMethodGet,
             Bucket:  s.bucket,
             Key:     key,
             Expires: int64(expires),
         }
         output, err := s.client.CreateSignedUrl(input)
         if err != nil {
             return "", err
         }
         return output.SignedUrl, nil
     }
    

实现CRUD增删改查

Update: 覆盖上传(同Create)

    func (s *ObsService) Update(key string, imageBytes []byte) error {
        return s.UploadBytes(key, imageBytes)
    }

删除上传的文件 Delete

    func (s *ObsService) Delete(key string) error {
        input := &obs.DeleteObjectInput{
            Bucket: s.bucket,
            Key:    key,
        }
        _, err := s.client.DeleteObject(input)
        return err
    }

Query: 列表查询(支持前缀)

    func (s *ObsService) List(prefix string) ([]string, error) {
        input := &obs.ListObjectsInput{
            Bucket: s.bucket,
            Prefix: prefix, // 如 "images/"
            MaxKeys: 100,
        }
        output, err := s.client.ListObjects(input)
        if err != nil {
            return nil, err
        }
        keys := make([]string, 0)
        for _, content := range output.Contents {
            keys = append(keys, content.Key)
        }
        return keys, nil
    }

调用obs实现的功能

    func main() {
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
        endpoint := "https://obs.cn-north-4.myhuaweicloud.com" // 替换区域
        bucket := "your-bucket-name"

        service := NewObsService(ak, sk, endpoint, bucket)
        defer service.Close()

        key := "images/test.jpg"

        // 示例数据(替换为真实图片字节)
        sampleBytes := []byte("fake image bytes")
        sampleBase64 := base64.StdEncoding.EncodeToString(sampleBytes)

        // 上传字节
        if err := service.UploadBytes(key, sampleBytes); err != nil {
            fmt.Println("UploadBytes err:", err)
        } else {
            fmt.Println("UploadBytes success")
        }

        // 上传Base64
        if err := service.UploadBase64(key+"-b64.jpg", sampleBase64); err != nil {
            fmt.Println("UploadBase64 err:", err)
        } else {
            fmt.Println("UploadBase64 success")
        }

        // 读取字节 & Base64
        bytes, _ := service.GetBytes(key)
        fmt.Printf("Bytes len: %d\n", len(bytes))
        b64, _ := service.GetBase64(key)
        fmt.Println(" Base64 preview:", b64[:50]+"...")

        // 临时链接(1小时)
        tempUrl, _ := service.GenerateTempUrl(key, 3600)
        fmt.Println("Temp URL:", tempUrl)

        // 查询列表
        list, _ := service.List("images/")
        fmt.Println("List:", list)

        // 更新(覆盖)
        service.Update(key, append(sampleBytes, 1)) // 修改字节
        fmt.Println("Update success")

        // 删除
        service.Delete(key)
        fmt.Println("Delete success")
    }

运行:

		go run main.go

说明:

错误处理:生产中添加完整错误处理

		if obsError, ok := err.(obs.ObsError)。

大文件:>5GB用UploadFile(多部分)。

		ContentType:上传时加input.ContentType = "image/jpeg"。

3 小结

本文使用golang使用华为云的OBS存储代码举例实现以下功能,图片的上传二进制字节,base64编码,图片读取,图片临时分享链接的生成,图片的CRUD 查询,更新,删除操作等基本功能。

华为云OBS存储服务兼容S3,集成华为云生态(如ModelArts),支持上传/下载/列表/删除、版本控制、加密、ACL、生命周期、多存储类(标准/低频/归档)。

参考:

			https://support.huaweicloud.com/sdk-go-devg-obs/obs_23_0103.html
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。