首页 > 其他分享 >07 - Go Ceph S3操作

07 - Go Ceph S3操作

时间:2023-02-16 14:23:04浏览次数:35  
标签:ceph return 07 err s3 Ceph nil Go main

ceph/ceph.go

// Package ceph Go对ceph s3文件增删改
package ceph

import (
	"fmt"
	"os"

	"gopkg.in/amz.v1/aws"
	"gopkg.in/amz.v1/s3"
)

// MgrCephS3 ceph s3
type MgrCephS3 struct {
	EndPoint  string // ceph s3地址
	AccessKey string // ceph s3 AK
	SecretKey string // ceph s3 SK

	CephConn *s3.S3 // cehp 连接
}

// NewMgrCephS3 构造函数
func NewMgrCephS3(endPoint, accessKey, secretKey string) *MgrCephS3 {
	return &MgrCephS3{
		EndPoint:  endPoint,
		AccessKey: accessKey,
		SecretKey: secretKey,
	}
}

// InitCephS3 初始化ceph s3连接
func (ms *MgrCephS3) InitCephS3() {
	auth := aws.Auth{
		AccessKey: ms.AccessKey,
		SecretKey: ms.SecretKey,
	}

	region := aws.Region{
		Name:                 "default",
		EC2Endpoint:          ms.EndPoint,
		S3Endpoint:           ms.EndPoint,
		S3BucketEndpoint:     "",
		S3LocationConstraint: false,
		S3LowercaseBucket:    false,
		Sign:                 aws.SignV2,
	}

	ms.CephConn = s3.New(auth, region) // 获取ceph s3连接
}

// InitBucket 获取一个桶连接
func (ms *MgrCephS3) InitBucket(bucket string) (*MgrBucket, error) {
	if ms.CephConn == nil {
		return nil, fmt.Errorf("MgrCephS3.CephConn is nil")
	}

	return &MgrBucket{
		BucketName: bucket,
		BucketConn: ms.CephConn.Bucket(bucket),
	}, nil
}

// MgrBucket 桶
type MgrBucket struct {
	BucketName string     // ceph s3 bucket桶名
	BucketConn *s3.Bucket // 桶连接
}

// Put2Bucket 上传文件到bucket
func (mb *MgrBucket) Put2Bucket(localPath, cephPath string) error {
	// 权限
	err := mb.BucketConn.PutBucket(s3.AuthenticatedRead)
	if err != nil {
		return err
	}

	// 读取文件
	bytes, err := os.ReadFile(localPath)
	if err != nil {
		return err
	}

	// 上传文件
	return mb.BucketConn.Put(cephPath, bytes, "octet-stream", s3.AuthenticatedRead)
}

// DownloadFromBucket 从Bucket下载文件
func (mb *MgrBucket) DownloadFromBucket(localPath, cephPath string) error {
	data, err := mb.BucketConn.Get(cephPath)
	if err != nil {
		return err
	}

	return os.WriteFile(localPath, data, 0644)
}

// DelBucketData 删除ceph上指定文件
func (mb *MgrBucket) DelBucketData(cephPath string) error {
	return mb.BucketConn.Del(cephPath)
}

// GetBatchFromBucket 批量获取文件信息
func (mb *MgrBucket) GetBatchFromBucket(prefixCephPath string) ([]string, error) {
	result, err := mb.BucketConn.List(prefixCephPath, "", "", 0)
	if err != nil {
		return nil, err
	}

	keyList := make([]string, 0)
	for _, key := range result.Contents {
		keyList = append(keyList, key.Key)
	}

	return keyList, nil
}

main.go

/*
需要提供ceph s3的信息为:
ceph url
ceph AccessKey
ceph SecretKey
ceph bucket 路径(例如: des-backet/

https://osstest.alnk.com
BSETGVM88JBHNNHPALNK
HQo8eER1Drc9LCEatEZqUfZEPJKTtPCl8jjQALNk
des-bucket
*/

package main

import (
	"fmt"

	"github.com/alnk-ceph-s3/ceph"
)

func main() {
	// 1. 获取ceph s3对象
	ms3 := ceph.NewMgrCephS3("https://osstest.alnk.com", "BSETGVM88JBHNNHPALNK", "HQo8eER1Drc9LCEatEZqUfZEPJKTtPCl8jjQALNk")

	// 2. 初始化ceph s3连接
	ms3.InitCephS3()

	// 3. 初始化桶连接
	bk, err := ms3.InitBucket("des-bucket")
	if err != nil {
		fmt.Println(err)
		return
	}

	// 上传文件
	if err := bk.Put2Bucket("./main.go", "alnk/main.go.1"); err != nil {
		fmt.Println(err)
		return
	}

	// 上传文件
	if err := bk.Put2Bucket("./main.go", "alnk/main.go.2"); err != nil {
		fmt.Println(err)
		return
	}

	// 上传文件
	if err := bk.Put2Bucket("./main.go", "alnk/main.go.3"); err != nil {
		fmt.Println(err)
		return
	}

	// 删除文件
	if err := bk.DelBucketData("alnk/main.go.2"); err != nil {
		fmt.Println(err)
		return
	}

	// 下载文件
	if err := bk.DownloadFromBucket("./main.go-ceph", "alnk/main.go.3"); err != nil {
		fmt.Println(err)
		return
	}

	// 批量获取文件
	fileSlice, err := bk.GetBatchFromBucket("alnk")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("fileSlice: ", fileSlice)  // fileSlice:  [alnk/main.go.1 alnk/main.go.3]
}

标签:ceph,return,07,err,s3,Ceph,nil,Go,main
From: https://www.cnblogs.com/lichengguo/p/17126621.html

相关文章

  • .Net6 + GraphQL + MongoDb 实现Subscription监听功能
    介绍查询、添加、修改我们已经演示了,我们来看下订阅。订阅大家可以理解为音乐软件,我们用户=>订阅音乐频道<=服务发送新的音乐通知到频道。有新的通知进入频道后,频......
  • 对服务器进行心跳检测 python django
    (由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因)具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自......
  • 2009-07-陪女朋友面试
     这天丽丽在QQ上发来消息,说老师给她联系了明天上午去南坪的面试机会。要刘文轩明天陪她一起去。第二天上午9点多,他们按照老师提供的地址进入一栋马路边的居民楼里。找到......
  • 如何在GORM GEN 中使用JSON Array(JSON_CONTAINS)
    点开GORMGEN的官方文档,发现文档中对于JSONQuery的描述就一句话我起初还以为是GEN不够发达,所以没实现JSONArray跟JSONSet但是在GORM的文档中却存在对于JSON的SET与Ar......
  • java.security.NoSuchAlgorithmException: Error constructing implementation (algor
    服务器迁移,在新服务器上发现邮件发送或者使用httpClient会报出下面的异常,问题可谓是惊人的相似。javaMail发送邮件异常:  使用httpClient异常: 先开始排查问题。......
  • django admin 字段设置
    来源:http://xieboke.net/article/100/djangoadmin后台里有些输入框长度、宽度、提示语等,可能不满足我们的需求,这个时候,我们就需要对admin的样式进行更改。还是先从d......
  • 【CF207C3】Game with Two Trees
    【CF207C3】GamewithTwoTreesDescription有两颗动态加入点的树,每条边有一个字符每次加入完点后T1中到根的链在T2中的匹配次数之和Input一行一个数\(q\)Output输......
  • go爬虫学习
    1、使用http库本人使用http库封装了Post请求和Get请求,并且封装成MyHttp库使用,可设置代理和请求头,返回响应包主体Myhttp.gopackageMyHttpimport( "fmt" "io/ioutil......
  • Python+Django(4):创建其他网页(模板继承)
    模板继承:1,修改主页父模板:抽取通用元素,在index.html同级目录下新建base.html<p><ahref="{%url'learning_logs:index'%}">LearningLog</a></p>{%blockcont......
  • Django——报错信息
    安装报错:报错信息:ValueError:nosignaturefoundforbuiltin<built-infunctionopenssl_md5>解决方法:这个上面写的是MD5错误,但不是这个样子,只是因为运行的配置......