Go使用OpenStack-swift对象存储
2019-10-02 本文已影响0人
树先生_张
工作中需要使用swift进行文件的上传,在网上搜了一下,感觉对go的使用都不是很友好,这里引用了一个包,进行了二次封装,菜鸟刚用go时间不久,欢迎大神指出问题。
先说一下我的目录结构。
目录结构
Bean.go文件内容
package SwiftUtils
// 使用结构体(具体咋用的我也不知道,抄的配置MySQL的文件)
type Sconfig struct {
Swift *SwiftConfig `json:"Swift"`
}
// 配置json结构体
type SwiftConfig struct {
UserName string `json:"userName"`
Password string `json:"password"`
IdentityEndpoint string `json:"IdentityEndpoint"`
DomainName string `json:"DomainName"`
ContainerName string `json:"containerName"`
}
config.json配置文件
{
"Swift": {
"userName": "账号",
"password": "密码",
"IdentityEndpoint": "http://IP地址:5000/v3",
"DomainName": "default",
"ContainerName": "认证的容器"
}
}
FeilUtils.go 工具类文件
package SwiftUtils
import (
"encoding/json"
"fmt"
"os"
)
// 读取json配置文件
func ReadJsonFile(path string, data interface{}) interface{} {
fmt.Println("path:", path)
file, e := os.Open(path)
if e != nil {
fmt.Println("ReadJsonFile open json file error:" + e.Error())
return data
}
decoder := json.NewDecoder(file)
e2 := decoder.Decode(data)
if e2 != nil {
fmt.Println("ReadJsonFile json decode error:" + e2.Error())
return data
}
return data
}
swift.go swift主文件内容
package SwiftUtils
import (
"fmt"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
"io/ioutil"
"net/http"
"strings"
"time"
)
//操作文件
func ConnectSwift() (c *gophercloud.ServiceClient) {
//swift json配置文件
SwConfig := GetConfig()
//认证
opts := gophercloud.AuthOptions{
IdentityEndpoint: SwConfig.Swift.IdentityEndpoint,
Username: SwConfig.Swift.UserName,
Password: SwConfig.Swift.Password,
DomainName: SwConfig.Swift.DomainName,
}
provider, err := openstack.AuthenticatedClient(opts)
if err != nil {
fmt.Printf("8AuthenticatedClient : %v", err)
return
}
//进行连接
client, _ := openstack.NewObjectStorageV1(provider, gophercloud.EndpointOpts{
Type: "object-store",
Name: "swift",
Region: "RegionOne",
})
// 返回连接信息
return client // 信息: &{0xc00014c840 http://ip:8080/v1/AUTH_6135fehth38f64853ddsdwrfwwcdc5f98/ object-store map[]}
}
// 查询所有文件
func QueryFile() (info []string) {
//swift json配置文件
SwConfig := GetConfig()
containerName := SwConfig.Swift.ContainerName // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
listOpts := objects.ListOpts{
Full: false,
}
// 连接信息
client := ConnectSwift()
allPages, err := objects.List(client, containerName, listOpts).AllPages()
if err != nil {
fmt.Println("查询异常: " + err.Error())
}
allObjects, err := objects.ExtractNames(allPages)
if err != nil {
fmt.Println("查询异常: " + err.Error())
}
url := client.ResourceBaseURL()
result := make([]string, 0)
for _, object := range allObjects {
url := url + containerName + "/" + object // 拼接url
result = append(result, url) // 把URL添加到数组里
}
return result // 返回数组信息
}
// 上传文件
func UploadFile(r *http.Request) (c []string) {
//swift json配置文件
SwConfig := GetConfig()
containerName := SwConfig.Swift.ContainerName // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
client := ConnectSwift()
file, head, err := r.FormFile("file") // 读取文件
if err != nil {
fmt.Println(err)
fmt.Println(head.Filename)
return
}
defer file.Close()
body, err := ioutil.ReadAll(file) // 读取请求体信息
if err != nil{
fmt.Println("http read error")
}
src := string(body)
Info := objects.CreateOpts{
ContentType: "text/plain",
Content: strings.NewReader(src), // 读取字符串信息
}
now := time.Now()
date := now.Format("20060102150405") // 格式化时间输出
name := head.Filename
fmt.Println(name)
c = strings.Split(name, ".")
FileName := date + "." + c[1]
objects.Create(client,containerName, FileName, Info) // 上传
result := QueryFile() // 返回查询信息
return result // 返回查询信息
}
// 删除文件
func DeleteFile(FileName string) (s []string) {
//swift json配置文件
SwConfig := GetConfig()
containerName := SwConfig.Swift.ContainerName // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
// 连接配置信息
client := ConnectSwift()
objects.Delete(client, containerName, FileName, nil).Extract()
result := QueryFile() // 返回查询信息
return result // 返回查询信息
}
// 查询单个文件
func QueryAFile(FileName string) (r string) {
// 查询单个文件主要用在信息查询上
result := QueryFile()
for _, r := range result{
str := r[(strings.LastIndex(r, `/`)+1):] // 切片出文件名
if str == FileName{ // 当等于文件名的时候进行返回
return r // 返回查询信息
}
}
return
}
SwiftConfigManager.go 配置文件初始化
package SwiftUtils
import "flag"
var Swift *Sconfig
// 读取json
func GetConfig() *Sconfig {
if Swift == nil {
Swift = &Sconfig{
Swift: new(SwiftConfig),
}
ReadJsonFile(filePath, Swift)
}
return Swift
}
var filePath string
// 初始化配置文件
func init() {
path := flag.String("path", "./SwiftUtils/config.json", "setting file path")
flag.Parse()
filePath = *path
}
有哪里写的不够清楚,可以直接在评论区说,看到会第一时间进行回复。
如何使用。
上传文件的时候:
func UploadInfo(v3contract V3Contract, r *http.Request) (re BaseResult) {
v3contract.ContractDocumentUrl = SwiftUtils.UploadFile(r) // 直接传入r就行
re.Result = v3contract.ContractDocumentUrl
re.Code = SUCCESS
re.Message = SUCCESS_MESSAGE
return re
}
其他使用的方法都是比较简单的直接传入文件名称,就可完成查询,删除操作。