使用OBS征服非结构化数据【玩转华为云】
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()
    }
- 
上传图片二进制字节 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 }
- 
上传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) }
- 
读取图片为二进制字节 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 }
- 
读取图片为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 }
- 
生成图片临时分享链接(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
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)