首页 > 其他分享 >go ceph s3文件管理

go ceph s3文件管理

时间:2023-05-24 22:22:37浏览次数:27  
标签:return nil err s3 bucket ceph cephPath go

导入依赖

go get gopkg.in/amz.v1/aws
go get gopkg.in/amz.v1/s3

创建用户

在初始化连接之前,我们需要创建一个用户得到accessKey和secretKey,新增用户的指令如下:

docker exec ceph-rgw radosgw-admin user create --uid="test" --display-name="test user"

封装使用

package main

import (
	"gopkg.in/amz.v1/aws"
	"gopkg.in/amz.v1/s3"
	"io/ioutil"
	"log"
)

var cephConn *s3.S3

// GetCephConnection : 获取ceph连接
func GetCephConnection() *s3.S3 {
	if cephConn != nil {
		return cephConn
	}
	// 1. 初始化ceph的一些信息
	auth := aws.Auth{
		AccessKey: "N4GHKXCJNT4S8M0LFSV0",
		SecretKey: "ZrDN1DhWNWo2Hw3JxGk0cmlBfkThu1aXUuzNGQ2g",
	}

	curRegion := aws.Region{
		Name:                 "default",
		EC2Endpoint:          "http://127.0.0.1:7480",
		S3Endpoint:           "http://127.0.0.1:7480",
		S3BucketEndpoint:     "",
		S3LocationConstraint: false,
		S3LowercaseBucket:    false,
		Sign:                 aws.SignV2,
	}

	// 2. 创建S3类型的连接
	return s3.New(auth, curRegion)
}

// GetCephBucket : 获取指定的bucket对象
func GetCephBucket(bucket string) *s3.Bucket {
	conn := GetCephConnection()
	return conn.Bucket(bucket)
}

// 将本地文件上传到ceph的一个bucket中
func put2Bucket(bucket *s3.Bucket, localPath, cephPath string) (*s3.Bucket, error) {
	err := bucket.PutBucket(s3.PublicRead)
	if err != nil {
		log.Fatal(err.Error())
		return nil, err
	}

	bytes, err := ioutil.ReadFile(localPath)
	if err != nil {
		log.Fatal(err.Error())
		return nil, err
	}

	err = bucket.Put(cephPath, bytes, "octet-stream", s3.PublicRead)
	return bucket, err
}

// 从ceph下载文件
func downloadFromCeph(bucket *s3.Bucket, localPath, cephPath string) error {
	data, err := bucket.Get(cephPath)
	if err != nil {
		log.Fatal(err.Error())
		return err
	}
	return ioutil.WriteFile(localPath, data, 0666)
}

// 删除指定的文件
func delCephData(bucket *s3.Bucket, cephPath string) error {
	err := bucket.Del(cephPath)
	if err != nil {
		log.Fatal(err.Error())
	}
	return err
}

// 删除桶,删除桶时要保证桶内文件已经被删除
func delBucket(bucket *s3.Bucket) error {
	err := bucket.DelBucket()
	if err != nil {
		log.Fatal(err.Error())
	}
	return err
}

// 批量获取文件信息
func getBatchFromCeph(bucket *s3.Bucket, prefixCephPath string) []string {
	maxBatch := 100

	// bucket.List() 返回桶内objects的信息,默认1000条
	resultListResp, err := bucket.List(prefixCephPath, "", "", maxBatch)
	if err != nil {
		log.Fatal(err.Error())
		return nil
	}

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

	return keyList
}

测试

package main

import (
	"fmt"
	"time"
)

func main() {
	bucketName := "bucket_test"
	filename := "/niuben/ceph_store/1308540.jpg"
	cephPath := "/static/default/bucket_test/V1/" + "1308540.jpg"

	// 获取指定桶
	bucket := GetCephBucket(bucketName)

	// 上传
	bucket, err := put2Bucket(bucket, filename, cephPath)
	if err != nil {
		return
	}

	// 下载
	localPath := "/niuben/ceph_store/1308540_ceph.jpg"
	err = downloadFromCeph(bucket, localPath, cephPath)
	if err != nil {
		return
	}

	// 获得url
	url := bucket.SignedURL(cephPath, time.Now().Add(time.Hour))
	fmt.Println(url)

	// 批量查找
	prefixCephpath := "static/default/bucket_test/V1"
	lists := getBatchFromCeph(bucket, prefixCephpath)
	for _, list := range lists {
		fmt.Println(list)
	}

	// 删除数据
	delCephData(bucket, cephPath)

	// 删除桶
	delBucket(bucket)

}

测试时,可以 go run store.go main.go 运行结果

标签:return,nil,err,s3,bucket,ceph,cephPath,go
From: https://www.cnblogs.com/niuben/p/17429730.html

相关文章

  • django使用mysql数据库
    1、启动/停止mysqlnetstartmysql80netstopmysql802、登录mysqlmysql-uroot-ppassword3、创建数据库/databasecreatdatabaseday10DEFAULTCHARSETutf8COLLATEutf8_general_ci;4、pycharm设置使用mysql,在settings中添加如下代码1DATABASES={2......
  • mongo.php
    "root",'password'=>"123456",'db'=>"admin"]);return$manager;}functionmongoQuery($manager){//查询$filter=['age'=>['$gt'=>5]......
  • django配置文件作用,drf 登录功能,drf认证组件,drf权限组件,drf频率组件
    django配置文件作用:    drf登录功能:view内:from.modelsimportUserInfo,UserTokenfromrest_framework.viewsetsimportViewSetimportuuidfromrest_framework.responseimportResponsefromrest_framework.decoratorsimportactionclassUser......
  • Go语音环境安装
    下载安装包https://studygolang.com/dl选择安装路径检查是否安装成功goversion在环境变量的系统变量中,新建并配置GOROOT(配置安装目录)和GOPATH(配置工作目录,用于代码存储)环境变量,然后将用户变量中的GOPATH也修改成系统变量的GOPATH路径检查系统变......
  • 使用 CloudFlare Argo Tunnel 实现内网穿透 All In One
    使用CloudFlareArgoTunnel实现内网穿透AllInOnedemos(......
  • Django 路由分发
    Django路由分发当一个url请求过来之后1、先到项目主目录下的urls内。2、由这个url做处理分发给其他app内的urls。一级路由:主目录urls内引入includefromdjango.conf.urlsimporturl,includeurlpatterns=[#指定分发的app目录名称url(r'^cmdb/',include("app0......
  • 讯飞开放平台机器翻译(新)golang实现demo
    最近做项目用到翻译功能,对接了一下科大讯飞的翻译api接口,demo如下:packagemainimport( "crypto/hmac" "crypto/sha256" "encoding/base64" "encoding/json" "fmt" "io/ioutil" "net/http" "time" "......
  • Spring MVC +MyBatis3全注解实例详解
    SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解(一):[url]http://www.blogjava.net/bolo/archive/2011/05/23/349655.html[/url]如何配置Eclipse,Maven,Jetty并运行工程.如是使用Tomcat的话,改插件为:[url]http://tomcat.apache.org/maven-plugin......
  • 使用JPA+Struts2+Spring 在 google Appengine开发应用
    本文同时发表在我在googleAppengine上的搭建的博客:[url]http://blogfor11lu.appspot.com/articleaction_view.action?article.id=agtibG9nZm9yMTFsdXIPCxIHQXJ0aWNsZRjBtQMM[/url]之前用JDO和Struts2在googleAppengine上试着写了一个简单的blog程序,但我还是希望使用Spring......
  • golang使用小技巧
    封装gorouting并捕捉panic从k8s源码中学到的,觉得小而精,感觉比定时器好用呢k8s源码中是这样使用的//每隔peroid后就执行传入的函数funcForever(ffunc(),periodtime.Duration){ for{ func(){ deferHandleCrash()//捕捉函数中的panic f() }() time.Sleep(per......