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
}

其他使用的方法都是比较简单的直接传入文件名称,就可完成查询,删除操作。

上一篇下一篇

猜你喜欢

热点阅读