使用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)